2019亚洲日韩新视频_97精品在线观看_国产成人精品一区二区_91精品网站在线观看

一種穩定且高效的串口分幀方法的研究及實踐

來源:期刊VIP網所屬分類:通信時間:瀏覽:

  摘要:在上位機和單片機通訊過程中,串口通訊是一種常見的通訊方式,特別是在高頻率的RFID串口通訊中,數據從單片機向上位機發送非常快,此時穩定且高效的串口分幀技術能從根本上保證數據通訊的正確性,本文基于多年項目實戰,總結出了一中基于幀頭特征位和協議校驗的分幀方法,在多種復雜串口通訊場景中均能正確高效分幀,為上層的業務系統切實提供了可靠的支撐。

  關鍵詞:上位機,單片機,串口通訊,分幀

通訊技術論文

  一.研究背景

  在上位機和單片機的串口通訊中,當串口數據以協議的格式源源不斷地發送到上位機的時候,上位機就需要對數據進行分幀及后續的解析,能正確且高效地分幀是后續所有業務功能的關鍵,很多初學者在處理該算法時由于考慮不全面很容易走彎路,導致在分幀時不能100%正確或者效率低下致使程序運行緩慢,導致后續業務功能的不正確,根據常規的算法邏輯,一般的處理方法有兩種:延時等待一次性數據讀取和把串口數據轉變成字符串進行截取,但實際應用中發現這兩種方法均存在不完善的地方,本文在多年項實戰的基礎上,總結出一種直接解析串口字節數據流,根據協議本身進行校驗的分幀方法,首先直接解析字節流不涉及到對串口數據進行格式轉換,節省了性能開銷,其次基于協議的校驗分幀可以應對各種數據格式和情況,能覆蓋數據的任意變化而始終保持正確的解碼率,給后續業務系統提供可靠的數據解析支撐,該方法通過眾多項目的驗證特別是極限性能測試證明是有效的。

  二.串口數據分幀常見算法及存在問題

  針對于串口數據的非連續上傳而由用戶事件觸發的情況,比如IC讀卡器的刷卡,指紋儀中指紋認證,用戶的操作速度在和內部程序處理的速度完全不在同一個數量級,同時鑒于串口數據在單片機MCU處理的時候本身就存在發送間隔,一般為50ms,可以利用這個特點在上位機進行延時等待,比如在上位機設置和MCU相同的停頓時間,在程序中使用線程停頓50ms,理想情況下,如果時序能保持一致,則可以和單片機取得同步,延時后讀取串口緩沖區數據并進行處理,這種方法是最初級的方法,最直觀的特點是容易理解和操作,但數據一旦以非常快的速度連續上傳,比如在RFID主機感應標簽的場景中,上位機和單片機保持完全同步是很困難的,這就會造成讀取的數據會出現很多的非完整幀,當出現斷幀時而不進行首尾的拼接處理則意味著數據的丟失,在實際的測試中,這種情況下斷幀現象很明顯,所以這種最直觀的做法只適用于數據上傳速度很低的情況,高速的串口數據通訊中這種做法漏洞很大。

  第二種常見的分幀方法則是將數據無論什么時候上傳過來就接收并轉化為字符串進行截取,并同時進行上下斷幀的首尾拼接處理,理論上來說,這種方法邏輯上沒有問題,在使用具體編程語言實現的時候,主要注意語句的書寫和處理,是能保證100%正確的分幀,但在實現的過程中有個無法回避的問題,即將數據轉化為字符串時的性能消耗,一般情況下,在性能較好的PC上開發應用程序問題不大,但在硬件條件相對較低的嵌入式終端中,這樣處理數據也還是會遇到性能上的瓶頸,在目前的常用的編程語言中,字符串的處理都是相對消耗資源的,特別是數據類型的選型不合適,更會拖累程序的總體表現,比如String和StringBuilder的性能差別就很大,如此種種,在實際使用中,這種方法的實際效果也不盡如人意。

  在走過一定的彎路后,開始從串口上傳的原始數據上重新審視既能正確分幀同時效率又高的方法,其實一切問題的解決都要從根源入手,通過對比常見的編程語言對串口數據的處理,發現最原始的數據都是字節流,即字節數組,那么此時基于這種數據結構本身不加任何類型轉換來對其進行處理將是效率最高的,同時,為了保持數據上傳的流暢度,程序中不能加任何的線程停頓,否則會導致數據積壓,遵循數據上傳的原始速度,將數據按照協議統一讀入公共緩沖區,利用協議對其每一個字節流的數據進行分析,下面來詳細展開該算法的實現描述。

  三.基于幀頭特征位和協議校驗分幀方法的算法實現

  該算法的基礎是標準Modbus協議,支持在幀頭幀尾加上用戶自定義設置,以下面兩個連續的數據幀片段為例: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,首先該數據的協議格式為如下表所示。

  需要特別說明的是,上述協議中,前面4個字節是自定義格式部分,非標準Modbus協議格式,從第5位開始到一幀結束才是標準Modbus格式,即從物理地址到校驗,而校驗也是針對該幀中Modbus數據部分,幀頭的自定義內容不參與校驗,根據協議并對上述2幀連續數據的特點進行分析,可以得出如下圖1所示的目標效果的分幀格式。

  就數據特點而言,這是兩個不同類型的幀,數據長度不同,但即使相同,長度仍然不能成為分幀的依據,因為這里面可能有干擾數據,正確做法主要分為2個步驟,首先將讀取到的字節流按照循環對數據進行逐個解析,根據幀頭標志的特點確定幀頭的起始位置;定好幀頭后,由于校驗位是2位,當待解析的數據長度大于6(4位幀頭+2位校驗)時即開始計算校驗并逐位往后推進,當遇到校驗成功時即代表分出一個完整有效的幀,此時將該幀提交到業務邏輯進行處理,重新從下一位數據位按照上述規則進行分幀,如此循環往復,程序算法描述如下。

  聲明字節流變量allData和frameData,分別代表一次串口讀到的所有數據和分幀數據的臨時存儲,聲明整形變量all_Length和frame_Length分別代表所有數據的長度和當前數據幀位置指針,算法具體實現:

  推薦閱讀:《中興通訊技術》雜志為學術性與技術應用相結合的通信類專業刊物,由中興通訊股份有限公司與安徽科學技術情報研究所聯合主辦,國內外公開發行。

主站蜘蛛池模板: 遂昌县| 万载县| 晋中市| 晋宁县| 辽宁省| 霍山县| 永福县| 中牟县| 来宾市| 泰安市| 南宫市| 旌德县| 衡阳市| 龙泉市| 施甸县| 民权县| 宾阳县| 拉萨市| 通河县| 株洲市| 铜梁县| 当阳市| 南岸区| 瓦房店市| 霍城县| 鄂州市| 启东市| 内黄县| 陈巴尔虎旗| 盘锦市| 宣化县| 尼玛县| 南召县| 上犹县| 纳雍县| 包头市| 綦江县| 东方市| 皮山县| 海淀区| 齐河县|