1. 程式人生 > >串列埠的資料協議解析

串列埠的資料協議解析

接收來自串列埠的資料並解析,看起來是件容易的事情。而實際上,當協議變得複雜時,處理不好或者考慮不完善,會產生很多問題。

一般來說,通過串列埠傳輸的單個數據包都不會太大,否則,會導致資料被覆蓋。對於通過串列埠傳輸的大資料,處理的辦法是分割成多個小的資料包。可能出現的情況是因為接收和讀取的不同步,接收到的資料需要分為多次讀取,每次讀取的單個數據包的一部分或者是一個數據包的後半部分和一個數據包的前半部分。另一種可能性是通過藍芽或者紅外等技術傳輸時,在資料流中加入了多餘的資料。當傳輸的通道變得不可靠時,就需要引入一些冗餘和機制來保證上層資料的正確性。

解析資料的第一步是要從位元組流中提取出一個完整的資料包,我在這裡只是對如何抓取一個完整的資料包並解析記錄一些思路。

對於一個完整的資料包來說,必須要有可識別的部分。通常的識別方法是確定的字首、字尾和資料結構。一般來說,字首很好識別,而後綴,可能要結合資料結構來識別。

使用一個佇列來儲存中間資料,思路如下:

1. 如果佇列非空;

   將佇列中的資料取出,與新到達的資料合在一起,按照佇列為空處理。

2. 如果佇列為空;

  掃描位元組流:

      如果找到了字首,則判斷以該字首開始的資料是否一個完整的資料包。如果是,則處理,並將該資料包的結尾作為新的掃描起點。如果找不到字首,則將從該次掃描起點的所有資料壓入佇列。

相關推薦

自定義串列資料協議傳送hex檔案

hex檔案格式:Intel HEX is a file format that conveys binary information in ASCII text form. It is commonly used for programming microcontroller

串列資料協議解析

接收來自串列埠的資料並解析,看起來是件容易的事情。而實際上,當協議變得複雜時,處理不好或者考慮不完善,會產生很多問題。 一般來說,通過串列埠傳輸的單個數據包都不會太大,否則,會導致資料被覆蓋。對於通過串列埠傳輸的大資料,處理的辦法是分割成多個小的資料包。可能出現的情況是因為

串列資料解析通用方法

#region 解析方法2                 // Listening = true;////設定標記,說明我已經開始處理資料,一會兒要使用系統UI的。                 isReceive = true;                 //將

串列資料接收LCD液晶顯示

       接上篇部落格,對串列埠接收到的資料在LCD液晶上進行顯示,這裡只顯示了一個數據,拿了數組裡面的一個數據進行了顯示。硬體連線上:A板PA9---->B板PA10,A板PA10--->B板PA9。 #include "led.

解決Linux下串列資料接收不全的異常問題

1、引言     最近在Linux下除錯串列埠程式,遇到了串列埠資料接收不全的異常問題,經過將近一上午的努力終於找到問題根源,特此分享給大家,此次除錯過程中用到了主要用到了minicom工具,至於minicom的使用大家可以自行查詢相關資料。 2、正文  

串列通訊協議

串列埠通訊協議 2018年03月02日 10:02:47 guankaer 閱讀數:3199更多 個人分類: 微控制器  

[轉]WEB頁獲取串列資料

本文轉自:https://www.cnblogs.com/rockyhm/p/3434200.html 最近做一個B/S的專案,需要讀取電子秤的值,之前一直沒做過,也沒有經驗,於是在網上找到很多  大致分兩種 使用ActiveX控制元件,JS呼叫MSCOMM32.dll的串列埠控制元件對串

基於C# Winform的串列資料接收

https://blog.csdn.net/woolnil/article/details/78048272 今天,我分享一篇文章,講述 基於C# Winform的串列埠資料接收程式設計(適合大概明白WinForm程式設計的同學,沒有接觸過WinForm的同學下載原始碼學習)

利用定時中斷接收不定長度的串列資料

在使用串列埠時,通常會遇到一些功能,如在TFT螢幕上顯示串列埠收到的字串,這些字串直接是對方printf過來的,沒有任何協議,此時為了保證顯示內容是一整個句子(通常句子傳送會有間隔),這是我們可以用定時器進行判斷是否接收完成。 以stm32f4為例,程式碼基於正點原子的例程,為了閱讀

STM32串列通訊協議淺析

通訊協議是指在嵌入式開發中,不同的硬體系統或者作業系統之間進行資料交換的方式,是一種資料通訊的規約。 通訊協議有很多種,而我今天要說的是串列埠通訊協議,而且是基於STM32來說的。 首先說串列埠通訊,串列埠是微控制器最常見的外設。常見的UART串列埠主要有兩個線,

串列資料轉乙太網

1.概述   串列埠轉乙太網目前可以採用串列埠轉乙太網模組來實現,變得非常簡單易用,但是在該技術中出現的一些新問題、使用誤區需要引起注意。串列埠轉乙太網並不是簡單傳輸媒介的變化,而是串列埠到TCP/IP的協議轉化。其中關係到的關鍵技術包括:TCP/IP的工作模式問題、串列埠

用電能耗監測DTU工業級閘道器RS485串列資料採集

方案需求 隨著社會的發展,用電戶大量增加,使用者分散,管理不便,傳統抄表方式需要投入大量的人工和時間成本,急需一種自動化的、方便的、先進的秒錶方式。 傳統人工抄表方式效率低下,經常會出現漏抄、誤抄的情況。 傳統人工抄表方式需要投入大量的人工成本,耗費大量的時間,效率低下。 傳統自己抄表方式需要佈置大量

Ubuntu USB串列資料 讀取及顯示

顯示串列埠接受的資料命令      1.1 在終端輸入   lsusb  顯示所有連線的usb裝置      1.2 在終端輸入   ls /dev/ttyA* 顯示所有連線的虛擬USB裝置埠號

串列資料通過Tcp轉到伺服器實現資料轉發

主要目的:通過串列埠獲取外設的資料,轉發到伺服器進行處理並在Web端顯示裝置的資訊。 主要用到的知識點: 第一:串列埠通訊相關的知識。 1.串列埠通訊用到的兩個標頭檔案: #include <QtSerialPort/QSerialPort> #inclu

STM32高階開發(12)-在GCC中使用printf列印串列資料

在大家使用keil或是iar開發stm32等arm晶片的時候,想來最不陌生的就是使用print通過串列埠輸出一些資料,用來除錯或是其他作用。但是要明確的是由於keil iar gcc 他們使用的標準C語言庫雖然都遵循一個標準,但他們底層的函式實現方式都是不同的,那麼在GCC中

記一次linux下串列資料丟包解決過程

專案中兩個晶片之間用串列埠進行通訊,由於傳輸格式中有校驗位,在資料量很大的時候總是校驗失敗。於是花了很長的時間最終解決了這個問題。 首先串列埠丟資料有兩種情況(明顯排除傳送端傳送的資料不對),第一種是通道也就是串列埠線或者連線口不行,無法承受很高的波特率(我使用的波特率是9

讀取外部串列資料----01

Linux: 1,為了方便,先安裝一個串列埠除錯助手Socat,以及可以通過工具開啟兩個串列埠 我這裡運行了一個網上的一個python程式碼(virtualCom.py),可以模擬出兩個串列埠 檢視一個串列埠的資訊  或 用上面安裝的圖形工具socat,開啟命令是 sudo  &

STM32多串列共用printf列印串列資料

(1)問題描述: 多串列埠共用printf函式,百度到的資料大部分是建議重新寫一個xx_printf(format, …)。但是使用起來還是不方便,就此問題而言加上一個判斷語句便可解決。 (2)解決方法: printf函式最後呼叫的是int

英偉達tk1板的串列資料收發出錯問題

最近在做一個專案,需要用到英偉達的tk1板做開發,其中利用到了tk1上的串列埠做開發。 其中遇到了一個隱藏的bug,在用tk1板傳輸資料時,tk1的驅動會把部分資料如連續的多格0或者0x11這類資料吃掉,到串列埠上讀的時候發現有遠比我要傳送的資料要少。 因為一開始做的時候,

串列高效能處理串列資料,按位讀取處理案例

在現在的工控或者家用裝置通訊專案中,用到很多串列埠或者類串列埠通訊協議,其中 很多協議需要讀取操作,在讀取中為了防止阻塞,提高處理效能,縮短處理時間經常用到 select 函式來 讀取串列埠資料,select 是linux 真是個 神器啊,監控某一個檔案或者裝置,當有緩衝過來即可處理,而為了試用不同協議的長短