期刊VIP學術(shù)指導 符合學術(shù)規(guī)范和道德
保障品質(zhì) 保證專業(yè),沒有后顧之憂
來源:期刊VIP網(wǎng)所屬分類:通信時間:瀏覽:次
摘要:在上位機和單片機通訊過程中,串口通訊是一種常見的通訊方式,特別是在高頻率的RFID串口通訊中,數(shù)據(jù)從單片機向上位機發(fā)送非???,此時穩(wěn)定且高效的串口分幀技術(shù)能從根本上保證數(shù)據(jù)通訊的正確性,本文基于多年項目實戰(zhàn),總結(jié)出了一中基于幀頭特征位和協(xié)議校驗的分幀方法,在多種復雜串口通訊場景中均能正確高效分幀,為上層的業(yè)務系統(tǒng)切實提供了可靠的支撐。
關鍵詞:上位機,單片機,串口通訊,分幀

一.研究背景
在上位機和單片機的串口通訊中,當串口數(shù)據(jù)以協(xié)議的格式源源不斷地發(fā)送到上位機的時候,上位機就需要對數(shù)據(jù)進行分幀及后續(xù)的解析,能正確且高效地分幀是后續(xù)所有業(yè)務功能的關鍵,很多初學者在處理該算法時由于考慮不全面很容易走彎路,導致在分幀時不能100%正確或者效率低下致使程序運行緩慢,導致后續(xù)業(yè)務功能的不正確,根據(jù)常規(guī)的算法邏輯,一般的處理方法有兩種:延時等待一次性數(shù)據(jù)讀取和把串口數(shù)據(jù)轉(zhuǎn)變成字符串進行截取,但實際應用中發(fā)現(xiàn)這兩種方法均存在不完善的地方,本文在多年項實戰(zhàn)的基礎上,總結(jié)出一種直接解析串口字節(jié)數(shù)據(jù)流,根據(jù)協(xié)議本身進行校驗的分幀方法,首先直接解析字節(jié)流不涉及到對串口數(shù)據(jù)進行格式轉(zhuǎn)換,節(jié)省了性能開銷,其次基于協(xié)議的校驗分幀可以應對各種數(shù)據(jù)格式和情況,能覆蓋數(shù)據(jù)的任意變化而始終保持正確的解碼率,給后續(xù)業(yè)務系統(tǒng)提供可靠的數(shù)據(jù)解析支撐,該方法通過眾多項目的驗證特別是極限性能測試證明是有效的。
二.串口數(shù)據(jù)分幀常見算法及存在問題
針對于串口數(shù)據(jù)的非連續(xù)上傳而由用戶事件觸發(fā)的情況,比如IC讀卡器的刷卡,指紋儀中指紋認證,用戶的操作速度在和內(nèi)部程序處理的速度完全不在同一個數(shù)量級,同時鑒于串口數(shù)據(jù)在單片機MCU處理的時候本身就存在發(fā)送間隔,一般為50ms,可以利用這個特點在上位機進行延時等待,比如在上位機設置和MCU相同的停頓時間,在程序中使用線程停頓50ms,理想情況下,如果時序能保持一致,則可以和單片機取得同步,延時后讀取串口緩沖區(qū)數(shù)據(jù)并進行處理,這種方法是最初級的方法,最直觀的特點是容易理解和操作,但數(shù)據(jù)一旦以非??斓乃俣冗B續(xù)上傳,比如在RFID主機感應標簽的場景中,上位機和單片機保持完全同步是很困難的,這就會造成讀取的數(shù)據(jù)會出現(xiàn)很多的非完整幀,當出現(xiàn)斷幀時而不進行首尾的拼接處理則意味著數(shù)據(jù)的丟失,在實際的測試中,這種情況下斷幀現(xiàn)象很明顯,所以這種最直觀的做法只適用于數(shù)據(jù)上傳速度很低的情況,高速的串口數(shù)據(jù)通訊中這種做法漏洞很大。
第二種常見的分幀方法則是將數(shù)據(jù)無論什么時候上傳過來就接收并轉(zhuǎn)化為字符串進行截取,并同時進行上下斷幀的首尾拼接處理,理論上來說,這種方法邏輯上沒有問題,在使用具體編程語言實現(xiàn)的時候,主要注意語句的書寫和處理,是能保證100%正確的分幀,但在實現(xiàn)的過程中有個無法回避的問題,即將數(shù)據(jù)轉(zhuǎn)化為字符串時的性能消耗,一般情況下,在性能較好的PC上開發(fā)應用程序問題不大,但在硬件條件相對較低的嵌入式終端中,這樣處理數(shù)據(jù)也還是會遇到性能上的瓶頸,在目前的常用的編程語言中,字符串的處理都是相對消耗資源的,特別是數(shù)據(jù)類型的選型不合適,更會拖累程序的總體表現(xiàn),比如String和StringBuilder的性能差別就很大,如此種種,在實際使用中,這種方法的實際效果也不盡如人意。
在走過一定的彎路后,開始從串口上傳的原始數(shù)據(jù)上重新審視既能正確分幀同時效率又高的方法,其實一切問題的解決都要從根源入手,通過對比常見的編程語言對串口數(shù)據(jù)的處理,發(fā)現(xiàn)最原始的數(shù)據(jù)都是字節(jié)流,即字節(jié)數(shù)組,那么此時基于這種數(shù)據(jù)結(jié)構(gòu)本身不加任何類型轉(zhuǎn)換來對其進行處理將是效率最高的,同時,為了保持數(shù)據(jù)上傳的流暢度,程序中不能加任何的線程停頓,否則會導致數(shù)據(jù)積壓,遵循數(shù)據(jù)上傳的原始速度,將數(shù)據(jù)按照協(xié)議統(tǒng)一讀入公共緩沖區(qū),利用協(xié)議對其每一個字節(jié)流的數(shù)據(jù)進行分析,下面來詳細展開該算法的實現(xiàn)描述。
三.基于幀頭特征位和協(xié)議校驗分幀方法的算法實現(xiàn)
該算法的基礎是標準Modbus協(xié)議,支持在幀頭幀尾加上用戶自定義設置,以下面兩個連續(xù)的數(shù)據(jù)幀片段為例:CC DD 02 01 48 F3 00 05 4A C4 D7 E4 02 02 B0 54 CC DD 02 01 48 06 00 01 02 FF 97 73,首先該數(shù)據(jù)的協(xié)議格式為如下表所示。
需要特別說明的是,上述協(xié)議中,前面4個字節(jié)是自定義格式部分,非標準Modbus協(xié)議格式,從第5位開始到一幀結(jié)束才是標準Modbus格式,即從物理地址到校驗,而校驗也是針對該幀中Modbus數(shù)據(jù)部分,幀頭的自定義內(nèi)容不參與校驗,根據(jù)協(xié)議并對上述2幀連續(xù)數(shù)據(jù)的特點進行分析,可以得出如下圖1所示的目標效果的分幀格式。
就數(shù)據(jù)特點而言,這是兩個不同類型的幀,數(shù)據(jù)長度不同,但即使相同,長度仍然不能成為分幀的依據(jù),因為這里面可能有干擾數(shù)據(jù),正確做法主要分為2個步驟,首先將讀取到的字節(jié)流按照循環(huán)對數(shù)據(jù)進行逐個解析,根據(jù)幀頭標志的特點確定幀頭的起始位置;定好幀頭后,由于校驗位是2位,當待解析的數(shù)據(jù)長度大于6(4位幀頭+2位校驗)時即開始計算校驗并逐位往后推進,當遇到校驗成功時即代表分出一個完整有效的幀,此時將該幀提交到業(yè)務邏輯進行處理,重新從下一位數(shù)據(jù)位按照上述規(guī)則進行分幀,如此循環(huán)往復,程序算法描述如下。
聲明字節(jié)流變量allData和frameData,分別代表一次串口讀到的所有數(shù)據(jù)和分幀數(shù)據(jù)的臨時存儲,聲明整形變量all_Length和frame_Length分別代表所有數(shù)據(jù)的長度和當前數(shù)據(jù)幀位置指針,算法具體實現(xiàn):
推薦閱讀:《中興通訊技術(shù)》雜志為學術(shù)性與技術(shù)應用相結(jié)合的通信類專業(yè)刊物,由中興通訊股份有限公司與安徽科學技術(shù)情報研究所聯(lián)合主辦,國內(nèi)外公開發(fā)行。