2.2 Modbus协议栈设计
控制器能设置ASCII或RTU两种传输模式中的任何一种在标准的Modbus网络中通信。目前Z常用的是RTU模式。在消息中的每个8 bit字节包含2个4 bit的十六进制字符,在同样的波特率下,可比ASCII方式传送更多的数据[1]。本设计采用Modbus RTU传输模式,使用RTU模式的关键是帧字符时间的处理。要求至少为3.5个字符时间的空闲间隔将报文帧区分开,同时整个报文帧必须作为一个连续的数据流传输,2个字符之间的空闲间隔小于1.5个字符时间[2]。
协议栈采用分层设计,分为协议状态机处理部分和硬件相关部分。协议状态机部分,通过查询协议事件状态维护协议状态机,根据不同状态对接收帧进行校验以及对功能码的处理函数。硬件相关部分包括对定时器和串口的初始化配置以及相应的定时器中断、串口接收发送中断。协议栈程序的流程图如图5。应用程序将AD采样后处理好的数据存储在特定的缓冲区中,供上位机查询。协议栈的接收和发送Modbus RTU数据帧是通过一个由硬件提取层的调用驱动状态机来实现的。协议栈开T3.5字符计时中断、接收中断和发送中断,在主函数循环中对事件标志进行查询和处理。