⑴ 單片機串口數據處理框架
串口通信具有廣泛的應用,一方面串口配置簡單,僅需3根線(tx、rx、gnd)即可實現通信,另一方面串口具備全雙工通信的能力。因此串口開發是單片機開發中一個重要的能力。
串口通信的難點在於,每條通信命令的長度可能不一致,何時判斷數據包是否接收完整,每包數據如何校驗,在單片機開發中均佔用很大的工作量。
由於單片機往往同時對接多個串口通信,可以將所有的通信統一處理,收到一包數據後再通知相應的線程進行處理。
writeptr 和 readptr 分別記錄串口緩沖區內數據寫入和讀取的指針(標號)。一般將緩沖區構建為環形緩沖, *writeptr==*readptr 認為緩沖區空, *writeptr==*readptr + 1 認為緩沖區滿。 ctrl 欄位用來控制是否開始計時數據接收超時,在超時時間內沒接收到一個位元組的數據,重新累計數據包超時時間, timeout 欄位則是具體的超時時間。 discart 欄位用來丟棄不完整的數據包,如果數據包在規定的時間內均沒有收到完整數據,則將該數據包丟棄。
系統初始化時,對每個欄位進行賦值:
串口數據的接收既可以採用中斷的方式,也可以採用DMA的方式。盡管中斷方式會影響CPU使用效率,但從實際使用效果上來看,一般不是時間要求非常高的應用,中斷的影響非常小。
每收到一包數據,將 timeout 置零,並將 ctrl 置一,開始計算數據包是否超時。由於緩沖區是環形的, UartCtrl[UART_VIDEO].writeptr 欄位增加時需要注意對邊界的處理。
通過定時器中不斷檢測相應的欄位,來決定是否通知線程處理收到的數據包,或者丟棄不完整的數據包。
串口數據包往往具有比較簡單數據結構,如包頭、包尾、長度、校驗等欄位,通過對每包數據相應欄位的檢驗,判斷數據包是否完整及合法。不同的感測器的通信格式一般都比較類似,因此可以採用以下的流程進行檢驗。最後既可以將合格的數據包復制到另外的緩存進行處理,也可以在該函數中直接處理以節省空間。
處理完一包數據以後,若發現剩餘長度大於0,認為環形緩存中還有待處理的數據包,重新進入該函數進行處理。
串口數據的處理在單片機開發中佔有很大比重的工作量,通過上述數據結構和相應處理函數,可以將不同的感測器的數據用同樣的方式處理,有效提高開發效率。其他匯流排的數據處理,也可以採用類似的方式進行。