关于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中定义的变量就行,如下图:文章来源:https://www.toymoban.com/news/detail-632990.html
/******************************************************************************
定义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模板网!