C# 串口接收數據不完整解決辦法


 

 

//針對數據協議:head + len + playload + check 類型
 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中進行校驗
            byte[] ReceiveBytes = new byte[len + 4];
            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);
              
            ///執行對數據進行處理操作RunReceiveDataCallback(ReceiveBytes);
        }
        else //幀頭不正確時,記得清除
        {
            buffer.RemoveAt(0);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM