关于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的板子开发的,如果是别的板子,需要修改引脚

在这里插入图片描述

小灰灰的代码里,没有对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”,如图

在这里插入图片描述在这里插入图片描述

在下图281行打断点进行仿真,果然卡在这里。原因是我们Modbus Poll软件02测试时候设置的 Quantity=16 ,这意味着我们给单片机发送的是读取16个位的离散信号(开关量),如图
在这里插入图片描述

但是程序里 REG_DISCRETE_SIZE =8。于是我们把程序中 REG_DISCRETE_SIZE 设置为16,就没问题了。问腿解决请添加图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



这篇文章也很值得借鉴 移植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};




至此,本章完!

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用STM32CubeMX、LAN8720LwIPFreeRTOS实现网络通信,需要注意以下几点。 首先,STM32CubeMX是一个图形化配置工具,用于为STM32微控制器生成初始化的代码框架。我们可以通过选择所需的外设(如以太网控制器)和配置参数来生成代码。 其次,LAN8720是一个用于实现以太网通信的PHY(物理层)芯片,负责将数据从媒介访问控制层(MAC层)转换为物理传输信号。 接下来,LwIP(Lightweight IP)是一个轻量级的网络协议栈,用于实现TCP/IP协议。我们需要将LwIP集成到项目中,并配置好网络参数,如IP地址、子网掩码和网关。 最后,FreeRTOS是一个流行的实时操作系统,用于管理任务调度和资源管理。我们可以将网络通信任务添加到FreeRTOS的任务列表中,并通过队列和信号量等机制进行任务间通信和同步。 总体实现步骤如下: 1. 使用STM32CubeMX选择并配置以太网控制器和PHY,并生成初始化代码。 2. 配置LwIP的网络参数,如IP地址、子网掩码和网关。 3. 将LwIP集成到项目中,包括源代码和相应的头文件。 4. 添加网络通信任务到FreeRTOS的任务列表中。 5. 在网络任务中,使用LwIP提供的API进行网络初始化、连接设置以及数据收发等操作。 6. 通过使用队列或信号量等机制,实现不同任务间的数据共享和同步。 7. 在主函数中初始化FreeRTOS,并启动任务调度器。 通过以上步骤,我们可以利用STM32CubeMX、LAN8720LwIPFreeRTOS实现网络通信功能。这样我们就可以在STM32微控制器上实现网络连接、数据传输等网络应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值