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