环境为 IAR,STM32F407+LAN8720(微雪)+FreeRTOS(9.0.0)+LwIP(2.0.3)+Freemodbus(1.5.0).
Freemodbus 几点小bug:
porttcp.c /prvxMBTCPPortReceive() 函数需要将error变量初始化赋值,不然会乱来,有些编译器会默认将新变量置0,有些不会。
err_t error = ERR_OK;
所有的功能callback函数里的usRegAddress++;需注释掉,不确定程序里的多处usRegAddress++是什么用意,后续研究该地址+1的问题。
//usRegAddress++;
整理了一下Freemodbus TCP 接收发送主流程。
lwip tcp收到数据后,会调用注册过的prvxMBTCPPortReceive(),然后xMBPortEventPost()一个EV_FRAME_RECEIVED。
在eMBPoll()中get到EV_FRAME_RECEIVED后,会整理一下接收数据,然后post EV_EXECUTE。
在eMBPoll() 中EV_EXECUTE中会按ucFucntionCode进入xFuncHandler的不同函数里,处理不同的命令。
然后eMBTCPSend应答主站。
继续等待下一个Post给到EV_FRAME_RECEIVED。