串列埠的資料協議解析
接收來自串列埠的資料並解析,看起來是件容易的事情。而實際上,當協議變得複雜時,處理不好或者考慮不完善,會產生很多問題。
一般來說,通過串列埠傳輸的單個數據包都不會太大,否則,會導致資料被覆蓋。對於通過串列埠傳輸的大資料,處理的辦法是分割成多個小的資料包。可能出現的情況是因為接收和讀取的不同步,接收到的資料需要分為多次讀取,每次讀取的單個數據包的一部分或者是一個數據包的後半部分和一個數據包的前半部分。另一種可能性是通過藍芽或者紅外等技術傳輸時,在資料流中加入了多餘的資料。當傳輸的通道變得不可靠時,就需要引入一些冗餘和機制來保證上層資料的正確性。
解析資料的第一步是要從位元組流中提取出一個完整的資料包,我在這裡只是對如何抓取一個完整的資料包並解析記錄一些思路。
對於一個完整的資料包來說,必須要有可識別的部分。通常的識別方法是確定的字首、字尾和資料結構。一般來說,字首很好識別,而後綴,可能要結合資料結構來識別。
使用一個佇列來儲存中間資料,思路如下:
1. 如果佇列非空;
將佇列中的資料取出,與新到達的資料合在一起,按照佇列為空處理。
2. 如果佇列為空;
掃描位元組流:
如果找到了字首,則判斷以該字首開始的資料是否一個完整的資料包。如果是,則處理,並將該資料包的結尾作為新的掃描起點。如果找不到字首,則將從該次掃描起點的所有資料壓入佇列。