STM32 HAL庫 MODBUS-RTU 串口通信
????????現(xiàn)行市場上的MODBUS實(shí)現(xiàn)都是官方標(biāo)準(zhǔn)的某種變體。不同的供應(yīng)商設(shè)備之間可能無法正確的通信。我根據(jù)自己的需求用?MODBUS -RTU協(xié)議寫了一個(gè)通過串口通信的實(shí)現(xiàn)。
????????MODBUS協(xié)議的介紹可以參考這篇

? ? ????串口的配置可以參考之前寫的這兩篇


其中可以更改的部分中
本從機(jī)的地址碼是0x01
功能1的功能碼是0x78(這是MODBUS協(xié)議的自定義功能部分)
CRC校驗(yàn)失敗的返回功能碼是0x90
沒有此功能的返回功能碼是0x91
user_uart.h
????????在中斷接收到信息后,main.c主循環(huán)中會(huì)進(jìn)入Modbus_Service。首先判斷接收到的地址位,再判斷功能位,最后校驗(yàn)CRC。如果地址位不一致,那么該信息不是發(fā)送給該從機(jī)的,不繼續(xù)接收。如果功能位不存在,則返回No_Function功能碼和接收到的信息。如果CRC校驗(yàn)位校驗(yàn)有問題,則返回?CRC_Cheak_Wrong功能碼和接收到的信息。在執(zhí)行完后,清空串口接收標(biāo)志位,接收下一條數(shù)據(jù)。
????????CRC校驗(yàn)使用的是CRC-16查表法,依據(jù)所采用多項(xiàng)式的不同,得到的結(jié)果也不相同。常用的多項(xiàng)式有CRC-16/IBM和CRC-16/CCITT等。這里代碼采用的多項(xiàng)式為CRC-16/IBM: X16+X15+X2+1。
user_uart.c
main.c
可以改進(jìn)的部分:
? ? ? ? 首先是串口接收和發(fā)送可以改成DMA的形式,防止消耗過多的資源。其次接收串口信息時(shí)應(yīng)該建立一個(gè)FIFO寄存器,以達(dá)到減少漏收的情況。