微控制器串列埠通訊協議的實現

2021-08-13 10:51:34 字數 1359 閱讀 6218

微控制器上的串列埠是日常除錯和做一些簡單人機互動的一種重要的通訊方式,其原理網上有一大堆,這裡就不再贅述了,下面主要和大家分享一種我在實際專案中經常用到的乙個簡單的串列埠通訊協議和實現方式。

下面以stm32f103這款微控制器為例:

需要的片上資源:uart、tim

協議格式:

描述:整個資料報由16個位元組長度的資料組成 兩位幀頭 兩位功能位 十位資料位 兩位幀尾

實現原理:

將串列埠配置成中斷接收,每次接受到乙個8bit的資料則產生乙個中斷,進入中斷後把串列埠標誌位清零並對接受到的資料進行計數和儲存,超過16個資料則重新計數,舉個例子:

void usart1_irqhandler(void)//中斷服務函式                    

uart.uart_rx_buf[uart.rxcount++] = usart_receivedata(usart1);// 存到陣列 } }

定時器配置10ms產生一次中斷,優先順序低於串列埠中斷的優先順序,加入定時器的目的是檢查uart.uart_rx_buf[ ]這個陣列中資料是否為目標幀格式 然後通過解析函式判斷幀的的內容和功能並執行相應的功能

定時器中斷服務函式舉例:

void tim3_irqhandler(void)

//定時器中斷服務函式

}

定時器中斷服務函式中有兩個函式,乙個負責對指令的解析,另乙個執行指令對應的動作。

void uart_data_analyse(void)//解析函式

else

uart_flush();//清空標誌位和串列埠接受陣列

}else

uart_flush();//清空標誌位和串列埠接受陣列

}

解析函式對串列埠快取中的資料進行校驗,若不滿足條件就清空標誌位和串列埠的接收陣列。

執行函式:

void uart_process(void)//執行函式}}

}void task1(void)

注1:提一下 uart.procsee_flag 這個標誌位,針對上位機(如串列埠助手)不停的傳送指令的情況下 當執行函式正在執行某乙個動作的過程中突然識別到一條指令,這個時候要保證當前指令動作完成才能執行下一條指令的情況下需要加入這個標誌位,這個標誌位可以理解為判忙標誌位,當執行對應的task之前先將該標誌位置1,執行完成之後講標誌位清零準備接收下一條指令。在執行的過程中不理會串列埠的指令並將其清空。

整個實現方式大致如此,在目前的專案中我經常使用這種協議去除錯利用這個協議給微控制器傳資料或者動作指令,沒有遇到過什麼bug,但是這個協議還是有可以改進的空間,希望高手批評指正!

微控制器通訊協議

現在大部分的儀器裝置都要求能過通過上位機軟體來操作,這樣方便除錯,利於操作。其中就涉及到通訊的過程。在實際製作的幾個裝置中,筆者總結出了通訊程式的通用寫法,包括上位機端和下位機端等。1 自定義資料通訊協議 這裡所說的資料協議是建立在物理層之上的通訊資料報格式。所謂通訊的物理層就是指我們通常所用到的 ...

微控制器通訊協議

微控制器 通訊協議 現在大部分的儀器裝置都要求能過通過上位機軟體來操作,這樣方便除錯,利於操作。其中就涉及到通訊的過程。在實際製作的幾個裝置中,筆者總結出了通訊程式的通用寫法,包括上位機端和下位機端等。1 自定義資料通訊協議 這裡所說的資料協議是建立在物理層之上的通訊資料報格式。所謂通訊的物理層就是...

微控制器之IIC通訊協議

i2c iic,inter integrated circuit 兩線式序列匯流排,由philips公司開發用於連線微控制器及其外圍裝置。它是由資料線sda和時鐘scl構成的序列匯流排,可傳送和接收資料。在cpu與被控ic之間 ic與ic之間進行雙向傳送,高速iic匯流排一般可達400kbps以上。...