MODBUS移植的参考文章

http://www.modbus.org/specs.php

https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32

http://www.360doc.com/content/14/0906/09/17350204_407389804.shtml

http://blog.csdn.net/dldw8816/article/details/50595154

https://www.cnblogs.com/skl374199080/archive/2013/12/16/3476153.html

http://blog.csdn.net/arminkztl/article/details/11738395

从机流程

/*first:
->从机等待串口数据包
->接收到数据包触发串口中断-
->xMBRTUReceiveFSM()函数
-->不断接收数据但不保存,不断重置定时器-
->直到数据接收完后产生3.5T定时器中断,代表接收完成
->中断函数调用xMBRTUTimerT35Expired(void)函数
->根据状态RXINIT调用xMBPortEventPost(EV_READY)事件函数加入序列
->关闭定时器,设为RXIDLE,返回主程序。
->主程序poll根据EVREADY空操作取出事件,返回
second:
->再次接收到串口数据包
->进入中断函数xMBRTUReceiveFSM()
->根据状态RXIDLE数据存入RTUBUF,状态设为RXRCV,启动定时器
->收到下个数据包,存储数据并重置定时器,不断重复直到接收完数据包
->收完后产生3.5T定时中断xMBRTUTimerT35Expired()
->根据RXRCV发送事件EV_FRAME_RECEIVED,关闭定时器设为RXIDLE,返回主程序poll
->根据FRAMERECEIVED调用eMBRTUReceive()处理收到数据的存储指针,然后发送事件EV_EXECUTE
->然后返回主程序,继续执行poll,
->根据EVEXECUTE,提取功能码,并判断功能码确定功能处理函数指针,并调用该函数
处理:
->调用功能函数解析数据包(长度/地址、寄存器数量)
->执行功能函数的回调函数,提取数据。返回poll
->执行eMBRTUSend()
->TXXMIT,使能串口发送功能
->发送中断,调用xMBRTUTransmitFSM( )函数,输出完毕事件设为EV_FRAME_SENT,禁用串口发送,状态改为TXIDLE------à返回poll,根据FRAMESENT取出事件清空队列,一个循环完成
*/

libmodbus

rt_thread对其的实现实现:TCP需要开启TCP server,SAL,为避免错误可以屏蔽或让 wiz_setsockopt()直接返回0,注意modbus_mapping_new()几个参数的关系,不然会出现访问未动态分配的内存地址。

freemodbus:

rt_thread对其的实现实现

原文地址:https://www.cnblogs.com/jieruishu/p/8108231.html