A. 干货 | 动手写写Modbus-RTU协议
ModbusRTU协议的实现可以从以下三个方面进行阐述:物理层、链路层和应用层。
物理层: 基础交互:物理层与控制芯片通过UART和一个GPIO进行交互,是实现ModbusRTU的基础。
链路层: 报文接收:链路层主要负责报文接收服务,与物理层之间通过UART通信。 帧完整性判断:根据Modbus标准,帧间隔至少需3.5个字节时间,字节间隔不超过1.5字节时间。在3.5字节时间内没有接收新数据,即可判断接收到一个完整的帧。 CRC校验:为确保数据帧的接收,需加上CRC以完成数据帧的接收验证。 实现细节:对于51单片机,实现过程相对简单,其他单片机需根据具体情况调整。在接收过程中,检查每次接收字节后的间隔时间,超过1.5字节时间时,丢弃所有字节并重新开始接收。
应用层: 数据关联:将用户应用数据规划为表格,如使用0x03、0x10命令时,设计数据表来关联应用数据。例如,设计TemperatureSensorData和DAOutputData结构体用于温度传感器和DA模拟量输出的数据处理。 数据表设计:引入枚举E_IDXS快速存取应用数据表中的条目,应用数据表appDataTable类似于字典,实现快速数据查找与存取。 寄存器表设计:设计Modbus寄存器表结构体,包含地址、索引和数据类型等成员,将Modbus寄存器表与应用数据关联。 读写接口:提供GetDataFromReg和StoreDataToReg两个读写接口,用于Modbus应用层访问。GetDataFromReg用于从寄存器表中找到对应的应用数据内存地址,并将数据拷贝到缓冲区;StoreDataToReg用于从缓冲区接收报文并查询寄存器表中的数据索引及数据类型,实现数据搬运。 帧校验:在应用层处理链路层的帧校验,包括判断报文接收、检查报文正确性、CRC16校验以及验证请求是否为设备支持的命令和针对该设备的请求。
通过以上三个层次的详细设计和实现,可以构建一个完整的ModbusRTU协议从设备端系统。