关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp

这篇具有很好参考价值的文章主要介绍了关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus

这里使用了大佬 小灰灰搞电子 的代码,文章看 STM32F407+LAN8720移植Lwip和freeModbus实现MODBUS TCP
代码看 STM32F407+LAN8720+LWIP移植freemodbus TCP.zip

他的代码是基于正点原子F407的板子开发的,如果是别的板子,需要修改引脚

关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机

小灰灰的代码里,没有对02功能码的处理函数进行完善,在port.c中,修改 eMBRegDiscreteCB 函数如下:

/**
  *****************************************************************************
  * @Name   : 操作离散寄存器
  *
  * @Brief  : 对应功能码0x02 -> eMBFuncReadDiscreteInputs
  *
  * @Input  : *pucRegBuffer:数据缓冲区,响应主机用
  *           usAddress:     寄存器地址
  *           usNRegs:       操作寄存器个数
  *
  * @Output : none
  *
  * @Return : Modbus状态信息
  *****************************************************************************
**/
eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )
{
	
  //错误状态
  eMBErrorCode eStatus = MB_ENOERR;
  //操作寄存器个数
  int16_t iNDiscrete = ( int16_t )usNDiscrete;
  //偏移量
  uint16_t iRegIndex;
  
	pucRegBuffer = pucRegBuffer;
	
//
//判断地址合法性
//
  //判断寄存器时候再制定范围内
  if( ( (int16_t)usAddress >= REG_DISCRETE_START ) &&
     ( usAddress + usNDiscrete <= REG_DISCRETE_START + REG_DISCRETE_SIZE ) )
  {
    //获得偏移量
    iRegIndex = ( uint16_t )( usAddress - REG_DISCRETE_START );
    
    while( iNDiscrete > 0 )
    {
      *pucRegBuffer++ = xMBUtilGetBits( ucRegDiscreteBuf, iRegIndex,
                                       ( uint8_t)( iNDiscrete > 8 ? 8 : iNDiscrete ) );
			
      iNDiscrete -= 8;
      iRegIndex += 8;
    }    
  }
	else  //错误地址
	{
		eStatus = MB_ENOREG;
	}
	
	return eStatus;
}

我在这里遇到了Modbus Poll软件提示02功能测试返回字符不全的提示“Insufficient bytes received”,如图

关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机

在下图281行打断点进行仿真,果然卡在这里。原因是我们Modbus Poll软件02测试时候设置的 Quantity=16 ,这意味着我们给单片机发送的是读取16个位的离散信号(开关量),如图
关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机

但是程序里 REG_DISCRETE_SIZE =8。于是我们把程序中 REG_DISCRETE_SIZE 设置为16,就没问题了。问腿解决关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机
关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机
关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机
关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp,stm32,tcp/ip,单片机



这篇文章也很值得借鉴 移植lwip和freemodbus实现MODBUS/TCP


使用的时候,去看freemodbus的使用方法。
比如这篇,挺详细的理论。可以直接按照这个移植freeModbus,强烈推荐!!!!
|
|
|
|------>>> [STM32]STM32移植freemodbus实现modbusTCP
|
|
|
大概的使用方法就是,你按照教程移植好freemodbus后,直接去对应改变 port.c中定义的变量就行,如下图:



/******************************************************************************
                               定义Modbus相关参数
******************************************************************************/
//输入寄存器内容
u16 usRegInputBuf[REG_INPUT_NREGS] = {0x8001,0x7002,0x6003,0x5004,0x4005,0x3006,0x2007,0x1008};
//保持寄存器内容
u16 usRegHoldingBuf[REG_HOLDING_NREGS]={0x0002,0x0204,0x0306,0x0708,0x1122,0x3344,0x5566,0x7799,0x1234,0x2345};
//线圈状态
u8 ucRegCoilsBuf[REG_COILS_SIZE]={0x3,0x2,0x3,0x4,0x5,0x6,0x7,0x8};
//开关输入状态
u8 ucRegDiscreteBuf[REG_DISCRETE_SIZE]={0x11,0x02,0x03,0x04,0x05,0x06,0x07,0x08};




至此,本章完!文章来源地址https://www.toymoban.com/news/detail-632990.html

到了这里,关于关于STM32F4和GD32F4以太网,LAN8720+lwip+freemodbus,实现modbus tcp的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • STM32的以太网外设+PHY(LAN8720)使用详解(1):ETH和PHY介绍

    STM32的以太网外设+PHY(LAN8720)使用详解(1):ETH和PHY介绍

    STM32F4系列MCU内部集成了一个以太网外设(ETH),可以通过介质独立接口(MII)或简化介质独立接口(RMII)和外部PHY(如LAN8720)相连实现MCU的联网功能。 STM32F4系列的以太网外设(ETH)框图如下: 以太网外设框图中包含了MII、RMII、SMI三种接口,它们的详细介绍如下: 1.2.1 介

    2024年01月23日
    浏览(11)
  • STM32的以太网外设+PHY(LAN8720)使用详解(5):MAC及DMA配置

    STM32的以太网外设+PHY(LAN8720)使用详解(5):MAC及DMA配置

    stm32的ETH外设挂载在AHB1总线上,位于RCC_AHB1ENR的bit25-bit27: 相关语句如下: 直接调用ETH_DeInit函数来复位ETH外设 上述语句操作的寄存器如下: 首先设置位25为1复位以太网MAC(复位MAC寄存器到默认值),然后设置为0取消复位。 首先调用ETH_SoftwareReset函数复位MAC的DMA 上述语句操

    2024年02月03日
    浏览(13)
  • 【STM32】HAL库-以太网外设-LAN8720A-LWIP-无操作系统

    【STM32】HAL库-以太网外设-LAN8720A-LWIP-无操作系统

    KEIL:MDK_ARM_5.27 MCU:STM32F429IGT6 PHY_IC:LAN8720A LWIP:LWIP2.1.2 STM32CUBEMX:6.6.1 HAL:V1.27.1 LAN8720A使用RMII接口与STM32的ETH外设进行数据通信 STM32使用SMI接口读/写LAN8720A的寄存器 LAN8720A由外部25MHz晶振提供时钟,LED2/NINTSEL引脚配置为下拉,故PHY(LAN8720A)提供50MHz时钟给RMII的NINT/REFCLKO(此时引脚

    2024年02月08日
    浏览(30)
  • ESP32以太网(ETH)环境和参数配置,基于内部mac和外部PHY(LAN8720A)

    ESP32以太网(ETH)环境和参数配置,基于内部mac和外部PHY(LAN8720A)

    ESP32在网上的资料很多,但问题也各式各样。由于ESP32主要做wifi功能,因此对于以太网的资料也很少。相对应的开发板也很少。 本人使用的是淘宝上购买的雨甄机电的带网口的开发板(如下图) 安信可ESP-32S 参考资料主要以热心博主《兴趣使然_ 》的 (5条消息) ESP32 单片机学习

    2024年02月15日
    浏览(11)
  • 【ETH】以太网----PHY芯片LAN8720A----电路原理图

    【ETH】以太网----PHY芯片LAN8720A----电路原理图

    LAN8720A 是低功耗的 10/100M 以太网 PHY 层芯片,I/0 引脚电压符合EEE802.3-2005 标准,支持通过 RMI 接口与以太网 MAC 层通信,内置 10-BASE-T/100BASE-TX 全双工传输模块,支持 10Mbps 和 100Mbps。 LAN8720A 可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持 HPAuto-MDIX 自动

    2024年02月06日
    浏览(53)
  • GD32F450以太网(2-2): PHY芯片IP101GR介绍

    GD32F450以太网(2-2): PHY芯片IP101GR介绍

    接上文 《GD32F450以太网(1):ETH 外设接口简介》介绍了嵌入式以太网接口。 《GD32F450以太网(2-1):PHY芯片LAN8720A介绍》介绍了LAN8720A 本文介绍另外一款PHY芯片IP101GR,支持MII接口或RMII接口,可代替市场上LAN8710A/LAN8720A/KSZ8041等芯片。 IP101是台湾省九阳电子公司生产制造的,符合IEEE

    2023年04月08日
    浏览(14)
  • 【STM32F1】以太网通信之UDP/TCP实验

    在本实验中,开发板主控芯片通过 SPI 接口与 CH395Q 以太网芯片进行通讯,从而完成对 CH395Q 以太网芯片的功能配置、数据接收等功能,同时将 CH395Q 以太网芯片的 Socket0 配 置为 UDP 模式,并可通过按键发送 UDP 广播数据至其他的 UDP 客户端,也能够接收其他 UDP 客户端广播的数

    2024年02月07日
    浏览(19)
  • GD32F470之网络lwip+UDP配置+lan8720芯片

    GD32F470之网络lwip+UDP配置+lan8720芯片

    先申明,本栏目用的都是GD32F470芯片240M,软件用的是keil,编写用的是C++(其实和C没有区别). 和STM32的lwip配置大致一样,主要不一样的地方在于 PHY的配置顺序问题,下面会讲到. 我用的是lan8720,所以头文件要修改一下,在gd32f4xx_enet.h中。 把PHY_TYPE改为LAN8700, PHY_ADDRESS改为0, 这是

    2023年04月09日
    浏览(12)
  • STM32F407以太网DMA描述符和数据链路层收发数据

    STM32F407以太网DMA描述符和数据链路层收发数据

    本文主要介绍STM32F407单片机MAC内核的DMA描述符,以及如何实现以太网二层的数据收发。这一篇先实现数据链路层的正常收发,下一篇再去介绍如何把LWIP移植到单片机上。大部分资料都是把LWIP移植和以太网卡驱动放在一起介绍,对新手不友好。所以我在这篇文章先把网卡驱动

    2024年02月10日
    浏览(31)
  • Ethercat学习-GD32以太网学习

    Ethercat学习-GD32以太网学习

    1、GD32F4以太网简介 GD32F4系列以太网模块包含10/100Mbps以太网MAC,数据的收发都通过DMA进行操作,支持MII(媒体独立接口)与RMII(简化的媒体独立接口)两种与物理层(PHY)通讯的标准接口。 2、以太网模框图简介 ​ 以太网需要外接一个PHY(以太网芯片)才可以进行通信。与PH

    2024年02月06日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包