【導讀】本文給出逐次比較、基于FIFO隊列和基于狀態機的3種幀同步方法。通過測試、分析和比較得出,基于有限狀態機的方法是嵌入式系統串口通信中很有效的幀同步方法,同時也是一種很不錯的串口通信程序設計結構。
嵌入式串口同步幀數方法解析
串口通信是日前單片機和DSP等嵌入式系統之間,以及嵌入式系統與PC機或無線模塊之間的一種非常重要且普遍使用的通信方式。在嵌入式系統的硬件結構中,通常只有一個8位或16位的CPU,不僅要完成主流程的工作,同時還要處理隨時發生的各種中斷,因而嵌入式系統中的串口通信程序設計與PC機有很大的不同。若嵌入式系統中.中斷服務子程序在系統運行過程中占用了較多的時間,就有可能在中斷眼務子程序正運行時,又產生一個同類型或其他類型的中斷,從而造成主程序得不到執行或后續中斷數據丟失。所以,嵌入式系統中的串口通信雖然看似簡單,但其中仍有許多問題值得研究,例如串口通信過程中的幀同步問題。本文針對該問題給出了逐次比較、基于FIFO隊列和基于狀態機的3種幀同步方法。通過測試、分析和比較得出,基于有限狀態機的方法是嵌入式系統串口通信中很有效的幀同步方法,同時也是一種很不錯的串口通信程序設計結構。
1.串口通信的數據幀結構
現代工業控制,往往需要由多個獨立的控制模塊來共同完成。它們之間通過串口通信完成復雜的控制過程,必須在通信過程中加入必要的通信協議,以提高系統的可靠性和穩定性;而要完成特定的通信協議,就得有一定的同步機制。下面介紹一下簡化的串口通信數據幀結構,以便分析說明嵌入式系統串口通信過程中的幀同步方法。
假定串口發送的數據幀結構為:
其中:包頭用于同步,一般是一個或多個ASCII字符,本文中假定數據幀同步頭有2字節(0xAA、0x55);包長表示數據包中除去包頭和包長的字節數,一般用約定好的幾個字節表示;類型為通信協議里規定的命令類型;數據為應發送的主要信息;校驗通常采用單字節“異或”的方法。
2.串口通信中的幀同步方法
2.1 逐次比較的幀同步方法
首先等待串口數據,將接收到的第1個字節數據與約定好的包頭信息的第1個字節進行比較。如果不正確,則等待新字節,直到接收的數據與包頭信息的第1個字節相同。第1個字節比較正確以后,將收到的第2個字節與包頭信息的第2個字節進行比較。如果仍然正確,則說明串口接收已經同步,可以開始接收數據幀中的數據部分;否則,重新開始同步過程。其程序流程如圖1所示。
此種方法代碼量小,編程簡單,一般用于在主程序中以非中斷方式接收串口數據、實時性很差、數據幀較短的場合。但是,在串口速度過快且包頭字節數比較多的情況下,串口實現同步花費的時間很長或很難實現同步。例如,串口接收到序列Ox0O OxAA0xAA 0x55…,當遇到第一個“0xAA”時,該方法認為第1個字節正確開始比較第2個同步頭。第2個字節仍是“0xAA”而不是“0x55”,所以必須等待新的字節重新開始比較第1個同步頭。而緊隨其后的是“0x55”,因而,此時包頭的第1個字節也沒有同步上。事實上,“0x00 OxAA”是干擾字節,“0xAA 0x55”才是通信協議中的同步頭。
怎樣學好嵌入式技術?
隨著現代社會信息化進程的加快,嵌入式系統被廣泛的地應用于軍事、家用、工業、商業、辦公、醫療等社會各個方面,表現出很強的投資價值。從國際范圍來看,作為數字化電子信息產品核心的嵌入式系統目前其硬件和軟件開發工具市場已經突破2000億美元,嵌入式系統帶來的全球工業年產值更是達到了一萬億美元,隨著全球經濟的持續增長以及信息化的加速發展,嵌入式系統市場必將進一步增長。
根據中國物聯網校企聯盟的建議,學習嵌入式系統的必備條件與學習方法如下:
1、C開發經驗
條件:Linux
方法:主要是掌握ANSI C編程(不包括gtk,qt等圖形可視化開發)
2、網絡、操作系統、體系結構
條件:Linux,各種書,算法、例程。
方法:通過C編程實現簡單的網絡等知識的算法和過程。
3、嵌入式系統概念
條件:各個嵌入式網站,討論組,書籍
方法:少提問,多留給自己思考的空間。
4、嵌入式開發實踐
條件:各種嵌入式系統開發工具的demo版,包括編譯器,仿真器。
方法:一個是基于MCU/MDSP的嵌入式系統開發,另一個是像Palm OS,WinCE,uC/OS II等RTOS下的應用軟件開發。第一個是針對硬件開發而言的,而第二個則是針對軟件開發而言的。
5、硬件開發
條件:各種嵌入式芯片、存儲器等電路器件,protel99等電路設計軟件,電路板制作。
方法:這時候該有開發條件了,最起碼是51系列,這個比較方便。電路的設計內容較多,不過看起來嚇人,實際上比軟件要簡單的多。只要下功夫,實踐會告訴你一切。