最近乙個專案用到了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校驗的**(重點):
/*下面的是modbus運用的舉例**,這裡我對modbus協議做了些修改,在 「功能碼 」 跟 「資料長度 」 間多加了個 「讀寫標誌位」,實際專案時可以根據自己專案需求做一下修改也無可厚非:** 函式名: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函式即可,**如下:** 函式名: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
; }}}
/*只要經過這些步驟,就可以在stm32上簡單運用 modbus 協議了,其實 modbus 協議說難不難,它就跟我們平時自己定義的串列埠通訊協議類似,有資料頭、資料內容、資料尾,只不過更加科學規範罷了。** 函式名:void usart_rx(void)
說 明:接收資料處理
傳入值:無
傳出值:無**/
void usart_rx(void
) hal_uart_receive_dma(&huart1,rx_buffer,buffer_size);
}
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入...