下载此文档

FreeModbus-笔记.docx


文档分类:法律/法学 | 页数:约15页 举报非法文档有奖
1/15
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/15 下载此文档
文档列表 文档介绍
FreeModbus笔记Modbus-RTU是基于485总线基础上一个主从协议,主站主动发起通信,从站接收主站的消息并响应主站的指令。这里主要探讨FreeModbus中的RTU从站协议的实现。从站的串口每次接收一个字节数据,并产生串口中断(中断打开),那么串口中传过来的一个个字节如何组成一个Modbus的数据帧呢?。,这个时间和波特率相关,不同波特率下,。,,,在一般的串口通信中,发送1个字符需要:1位起始位,8位数据位,1位校验位(可无),1位停止位,总共1+8+1+1=11位,*11=,假如波特率是9600,那么传输1位的时间是1000/9600=(ms),这样,,即定时器需要的中断时间串行口数据帧D0D1D2D3D4D5D6D7Par起始位停止位1个字节1个字节1个字节1个字节1个字节t>T><,,都作为这一帧数据来处理。当串口在>,则认为当前主站Modbus发送完了一个数据帧。可以进行后面的Modbus数据帧处理了。再收到的数据回作为下一个Modbus数据帧的首字节。接收一个字节,是由串口中断来进行完成的,判断是否超时是由定时器中断来完成的。因此以上看是很清楚的一个协议流程需要串口和定时器配合共同完成。所以在看RTU实现协议时一定要记住这点。STATE_RX_INITSTATE_RX_IDLESTATE_RX_RCV串口收到一个新字节,且总字节数不超过最大帧长STATE_RX_ERROR从站主要是接收,被动响应,所以先分析接收机的状态:接收状态机接收状态包含以下几种:STATE_RX_INIT,/*!<接收机在初始态*/STATE_RX_IDLE,/*!<接收机在空闲态*/STATE_RX_RCV,/*!<接收到一帧数据*/STATE_RX_ERROR/*!<错误数据帧*/状态机转换图:eMBEnable()eMBRTUStart()设置初态串口收到一个字节串口收到一个新字节,但总字节数超过最大帧长串口收到一个新字节状态机的转换不是由一个函数来确定的,是由多个函数共同作用的结果。。所以在程序一开始要对串口和定时器进行正确的设置。当初始化完毕后,接收状态机初始态是STATE_RX_INIT,。,串口收到了一个字节,则认为是还没准备好的情况下,总线发起的一次Modbus传输,此时这帧数据是不处理的,所以,要等到这一帧数据传送完()。,说明总线上的数据帧已经传完,处于空闲状态,为发起下一帧数据传输做好了准备。所以接收状态机转换为STATE_RX_IDLE,同时发送一个EV_READY事件,告诉Modbus以及准备好接收数据了。。ModBus使能:置端口为接收状态开端口定时功能此时串口中断开,定时中断开eMBState=STATE_ENABLEDeRcvState=STATE_RX_INIT;ModBus初始化:设置从机号设置eMode(RTU)3、设置波特率4、设置T35定时器eQueuedEvent为空eMBState=STATE_DISABLEDeMBInit()eMBRTUInit()Uart_Init()xMBPortTimersInit()在STATE_RX_IDLE状态下,只会接收串口数据来触发状态转换(定时被关闭)。当接收到一个字节时,认为总线开始了一个新的数据帧的传输,把这个字节保存在Modbus数据缓冲区,并将缓冲区指针加1,并将接收状态机转换为STATE_RX_RCV。在STATE_RX_RCV状态下,接收到一个新字节,将该字节保存在缓冲区,并将缓冲区指针加1,判断接收的字节总长是否>最大帧长,如果不大于,继续保持STATE_RX_RCV状态,等待接收下一个字节或超时(接收完成)。当大于最大帧长,说明接收到了错误帧。状态转到STATE_RX_ERROR。在STAT

FreeModbus-笔记 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数15
  • 收藏数0 收藏
  • 顶次数0
  • 上传人cengwaifai1314
  • 文件大小248 KB
  • 时间2020-05-18