STM32F407+LAN8720移植Lwip和freeModbus实现MODBUS TCP

【STM32F407+LAN8720移植Lwip和freeModbus实现MODBUS TCP】Lwip和FreeModbus的移植这里补多说,大家下载我移植好的工程文件自己学习即可,主要说一下注意点一、初始化
初始化主要调用下面这两个函数,用来指定端口和使能TCP连接

eMBTCPInit(502 ); eMBEnable(MB_TCP);

二、关键函数的实现
/** ***************************************************************************** * @Name: 操作输入寄存器 * * @Brief: 对应功能码0x04 -> eMBFuncReadInputRegister * * @Input: *pucRegBuffer:数据缓冲区,响应主机用 *usAddress:寄存器地址 *usNRegs:操作寄存器个数 * * @Output : none * * @Return : Modbus状态信息 ***************************************************************************** **/ eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )/** ***************************************************************************** * @Name: 操作保持寄存器 * * @Brief: 对应功能码0x06 -> eMBFuncWriteHoldingRegister *0x16 -> eMBFuncWriteMultipleHoldingRegister *0x03 -> eMBFuncReadHoldingRegister *0x23 -> eMBFuncReadWriteMultipleHoldingRegister * * @Input: *pucRegBuffer:数据缓冲区,响应主机用 *usAddress:寄存器地址 *usNRegs:操作寄存器个数 *eMode:功能码 * * @Output : none * * @Return : Modbus状态信息 ***************************************************************************** **/ eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )/** ***************************************************************************** * @Name: 操作线圈 * * @Brief: 对应功能码0x01 -> eMBFuncReadCoils *0x05 -> eMBFuncWriteCoil *0x15 -> 写多个线圈 eMBFuncWriteMultipleCoils * * @Input: *pucRegBuffer:数据缓冲区,响应主机用 *usAddress:寄存器地址 *usNRegs:操作寄存器个数 *eMode:功能码 * * @Output : none * * @Return : Modbus状态信息 ***************************************************************************** **/ eMBErrorCode eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )/** ***************************************************************************** * @Name: 操作离散寄存器 * * @Brief: 对应功能码0x02 -> eMBFuncReadDiscreteInputs * * @Input: *pucRegBuffer:数据缓冲区,响应主机用 *usAddress:寄存器地址 *usNRegs:操作寄存器个数 * * @Output : none * * @Return : Modbus状态信息 ***************************************************************************** **/ eMBErrorCode eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) {

三、( void )eMBPoll( );
这个函数要在一个循环中调用,用来处理和发送数据
while(1) { LED0 = !LED0; ( void )eMBPoll(); OSTimeDlyHMSM(0,0,0,500); //延时500ms }

工程文件

    推荐阅读