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渲染组