STM32 HAL库 MODBUS-RTU 串口通信
2021-07-15 17:27 作者:僚机Wingplane | 我要投稿
现行市场上的MODBUS实现都是官方标准的某种变体。不同的供应商设备之间可能无法正确的通信。我根据自己的需求用 MODBUS -RTU协议写了一个通过串口通信的实现。
MODBUS协议的介绍可以参考这篇

串口的配置可以参考之前写的这两篇


其中可以更改的部分中
本从机的地址码是0x01
功能1的功能码是0x78(这是MODBUS协议的自定义功能部分)
CRC校验失败的返回功能码是0x90
没有此功能的返回功能码是0x91
user_uart.h
在中断接收到信息后,main.c主循环中会进入Modbus_Service。首先判断接收到的地址位,再判断功能位,最后校验CRC。如果地址位不一致,那么该信息不是发送给该从机的,不继续接收。如果功能位不存在,则返回No_Function功能码和接收到的信息。如果CRC校验位校验有问题,则返回 CRC_Cheak_Wrong功能码和接收到的信息。在执行完后,清空串口接收标志位,接收下一条数据。
CRC校验使用的是CRC-16查表法,依据所采用多项式的不同,得到的结果也不相同。常用的多项式有CRC-16/IBM和CRC-16/CCITT等。这里代码采用的多项式为CRC-16/IBM: X16+X15+X2+1。
user_uart.c
main.c
可以改进的部分:
首先是串口接收和发送可以改成DMA的形式,防止消耗过多的资源。其次接收串口信息时应该建立一个FIFO寄存器,以达到减少漏收的情况。