STM32 在串列埠通訊時運用MODBUS協議

2022-06-27 04:45:11 字數 2203 閱讀 2430

最近乙個專案用到了modbus協議,就學習了一下,這裡做一下記錄以免後續忘記。

要用到modbus肯定要先知道是mobus協議,這裡呢我們就又要先理解協議的含義了。

所謂的協議是什麼?就是互相之間的約定嘛,如果不讓別人知道那就是暗號。現在就來定義乙個新的最簡單協議。

例如:  協議:  「a」--「led滅」  「b」--「報警」  「c」--「led亮」 。

微控制器接收到「a」控制乙個led滅,微控制器接收到「b」控制報警,微控制器接收到「a」控制乙個led亮。那麼當收到對應的資訊就執行相應的動作,這就是協議。

modbus 一包資料主要組成有 :   裝置位址 功能碼  資料長度  資料  crc 

先來簡單分析一條modbus-rtu報文,例如:

這個包資料的意思是往裝置位址為 0x01 的裝置中,執行 0x1f 代號的功能 ,這裡假設 0x1f 代號功能碼代表的是儲存資料再flash,那這包資料的意思就是,控制 0x01 裝置,執行 0x1f 代號功能儲存後面4位資料到 mcu 的 flash 中,其中資料長度是指後面資料位元組數的大小,最後兩個 crc 校驗是除了最後兩位 crc 前面所有資料經過crc運算出來的校驗碼,用來保證資料的準確性。

協議大概就是這麼些內容,因為只是簡單的應用,就沒有深入去研究了,知道這些運用到stm32上已經夠了,下面的是crc校驗的**(重點):

/*

** 函式名:uint16_t crc(uint8_t rxbuff,uint8_t rx_len)

說 明:modbus協議crc校驗

傳入值:rxbuff 串列埠接收的資料,len串列埠接收的資料長度

傳出值:返回兩個位元組的crc校驗碼,高位在前,低位在後**/

uint16_t crc(uint8_t rxbuff,uint8_t rx_len)

}return

crc_result;

}

下面的是modbus運用的舉例**,這裡我對modbus協議做了些修改,在 「功能碼 」 跟 「資料長度 」 間多加了個 「讀寫標誌位」,實際專案時可以根據自己專案需求做一下修改也無可厚非:

/*

** 函式名:void modbus(uint8_t rxbuff,uint8_t len)

說 明:modbus協議處理

傳入值:rxbuff 串列埠接收的資料,len串列埠接收的資料長度

傳出值:無**/

void

modbus(uint8_t rxbuff,uint8_t len)

; uint8_t robot_add=0x01

; uint8_t robot =get_robot_num(); //獲取預先儲存好的裝置位址

uint16_t crc=crc(rxbuff,len);

uint16_t rx_crc = rxbuff[len-2]<<8 | rxbuff[len-1

];if((robot==rxbuff[0] ||rxbuff[0] ==0xff) && rx_crc==crc) //

判斷裝置位址是否正確,預留在不知道位址的時候,使用虛擬位址0xff,防止忘記裝置位址後,用虛擬位址可以修改

else

if(rxbuff[2]==0x01) //

break

;

case

0x22: //

操作裝置位址

if(rxbuff[2]==0x00) //

else

if(rxbuff[2]==0x01) //

break

; }}}

最後直接在串列埠接收處理函式裡呼叫modbus函式即可,**如下:

/*

** 函式名:void usart_rx(void)

說 明:接收資料處理

傳入值:無

傳出值:無**/

void usart_rx(void

) hal_uart_receive_dma(&huart1,rx_buffer,buffer_size);

}

只要經過這些步驟,就可以在stm32上簡單運用 modbus 協議了,其實 modbus 協議說難不難,它就跟我們平時自己定義的串列埠通訊協議類似,有資料頭、資料內容、資料尾,只不過更加科學規範罷了。

STM32之串列埠通訊

一 rs232通訊協議 1 概念 個人計算機上的通訊介面之一,由電子工業協會 electronic industries association,eia 所制定的非同步傳輸標準介面。2 電氣特性 邏輯1 mark 3v 15v 邏輯0 space 3 15v 3 介面 實現全雙工非同步通訊只需要三根...

stm32之串列埠通訊

1 首先對tx和rx進行配置 void init gpio void 2 對串列埠進行配置 3 對總中斷進行配置 4 傳送中斷 void usart1 it void 5 傳送位元組和字串 void usart sendbyte usart typedef pusartx,uint8 t ch vo...

stm32串列埠通訊

通訊方式 1 同步通訊 帶時鐘同步訊號傳輸 spi,iic等 2 非同步通訊 不帶時鐘用途訊號 usrt,單匯流排 stm32串列埠引腳表 串口號 rxd txd 1 pa10 pa9 2 pa3pa2 3 pb11 pb10 4 pc11 pc10 5 pd2pc12 通訊過程 接收過程 由rx入...