C# 串口操做系列(4) -- 協議篇,文本協議數據解析

C# 串口操做系列(4) -- 協議篇,文本協議數據解析

標籤: c#uiobjectstringbyte
 分類:
 

上一篇已經介紹了協議的組成,一個協議,通常具備 :協議頭+長度+數據+校驗 , 文本格式能夠直觀的定義回車換行是協議的結尾,因此咱們能夠省略數據長度,增長協議尾。即: 協議頭 + 數據 + 校驗 + 數據尾 。緩存

文本方式的數據比較容易分析。若是數據緩存,能夠考慮用StringBuilder。或是不緩存也能夠。文本格式數據大多有換行結尾。稍微修改便可。例如分析常見的NMEA 0183格式的衛星座標數據GGA。post

$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77ui

 

$              開始this

GPGGA     命令字spa

*              結尾.net

77            校驗線程

 

對上一篇代碼稍做修改就能夠了。例子不貼了。文本格式比較簡單,只是爲了內容完整。貼來作參考。只有分析的地方簡化不少。設計

 

 

[c-sharp]  view plain  copy
 
  1.     void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)  
  2.     {  
  3.         if (Closing) return;//若是正在關閉,忽略操做,直接返回,儘快的完成串口監聽線程的一次循環  
  4.         try  
  5.         {  
  6.             Listening = true;//設置標記,說明我已經開始處理數據,一下子要使用系統UI的。  
  7. //文本格式比較簡單,你能夠死等。  
  8. string line = comm.ReadLine();//這就獲得回車換行結尾的了。可是不是從頭開始的就要檢查了  
  9.             /////////////////////////////////////////////////////////////////////////////////////////////////////////////  
  10.             //<協議解析>  
  11. //由於恢復的代碼在finally中。你能夠直接的return  
  12.             if(line[0] != '$') return;//雖然可能有點垃圾,可是數據不重要。直接丟棄就能夠了。後續的都是對的  
  13. int star = line.IndexOf("*",1);  
  14. if(star == -1) return;  
  15. //根據$後面數據計算異或校驗,並和*後面的數字對比。若是不一樣,也不進行分析。由於校驗錯誤  
  16.   
  17. //當肯定頭尾存在,校驗正確。就能夠分析數據了。  
  18.             //分析數據  
  19.             //略  
  20.   
  21.             //由於要訪問ui資源,因此須要使用invoke方式同步ui。  
  22.             this.Invoke((EventHandler)(delegate  
  23.             {  
  24.                 //判斷是不是顯示爲16禁止  
  25.                 if (checkBoxHexView.Checked)  
  26.                 {  
  27.                     //依次的拼接出16進制字符串  
  28.                     foreach (byte b in buf)  
  29.                     {  
  30.                         builder.Append(b.ToString("X2") + " ");  
  31.                     }  
  32.                 }  
  33.                 else  
  34.                 {  
  35.                     //直接按ASCII規則轉換成字符串  
  36.                     builder.Append(Encoding.ASCII.GetString(buf));  
  37.                 }  
  38.                 //追加的形式添加到文本框末端,並滾動到最後。  
  39.                 this.txGet.AppendText(builder.ToString());  
  40.                 //修改接收計數  
  41.                 labelGetCount.Text = "Get:" + received_count.ToString();  
  42.             }));  
  43.         }  
  44.         finally  
  45.         {  
  46.             Listening = false;//我用完了,ui能夠關閉串口了。  
  47.         }  
  48.     }  
  49.   
  50.       

 

 
4
相關文章
相關標籤/搜索