C# 解决串口接收数据不完整
? ? ? ? 使用緩存機制完成。首先通過定義一個成員變量List<byte>?buffer?=?new?List<byte> (4096);用來存放所有的數據,在接收函數里,通過buffer.AddRange()方法不斷地將接收到的數據加入到buffer中,并同時對 buffer中的數據進行檢驗,如果達到一定的長度并且校驗結果正確(校驗方法在發送方和接收方一致),再進行處理。具體代碼如下:代碼?private?List<byte>?buffer?=?new?List<byte>(4096);
 private?void?sp_DataReceived(objectsender,?EventArgs?e)?//sp是串口控件
 {
 int?n?=?sp.BytesToRead;
 byte[]?buf?=?new?byte[n];
 sp.Read(buf,?0,?n);
 //1.緩存數據
 buffer.AddRange(buf);
 //2.完整性判斷
 while?(buffer.Count?>=?4)?//至少包含幀頭(2字節)、長度(1字節)、校驗位(1字節);根據設計不同而不同
 {
 //2.1?查找數據頭
 if?(buffer[0]?==?0x01)?//傳輸數據有幀頭,用于判斷
 {
 int?len?=?buffer[2];
 if?(buffer.Count?<?len?+?4)?//數據區尚未接收完整
 {
 break;
 }
 //得到完整的數據,復制到ReceiveBytes中進行校驗
 buffer.CopyTo(0,?ReceiveBytes,?0,?len?+?4);
 byte?jiaoyan;?//開始校驗
 jiaoyan?=?this.JY(ReceiveBytes);
 if?(jiaoyan?!=?ReceiveBytes[len+3])?//校驗失敗,最后一個字節是校驗位
 {
 buffer.RemoveRange(0,?len?+?4);
 MessageBox.Show("數據包不正確!");
 continue;
 }
 buffer.RemoveRange(0,?len?+?4);
 /執行其他代碼,對數據進行處理。
 }
 else?//幀頭不正確時,記得清除
 {
 buffer.RemoveAt(0);
 }
 }
 }
總結
以上是生活随笔為你收集整理的C# 解决串口接收数据不完整的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 解决VS2019窗体设计器不显示
- 下一篇: markdownpad2 html渲染组
