串口通訊中接收資料時延遲處理與緩衝處理的解決方案(C#)

來源:互聯網
上載者:User

利用串口進行通訊,當發送方(A)將資料寫入串口後,通過無線或有線方式將資料傳送給接收方(B),B通過調用串口讀方法comm.read(參數)即可將資料讀出。原理十分簡單,但最近在利用串口處理SM-42無線傳輸時,資料總是一段一段的傳到B,並不能在comm_DataReceived方法中單純使用read方法將資料接收完全。我知道用緩衝機制,但由於經驗少(正在實習),到網上找了找大牛們的方法,並結合自己的理解,發現有兩種方法可以處理。

方法一:comm_DataReceived(Comm控制項的資料接收方法,當有資料來臨時會觸發)會建立一個線程(悲哀,因為之前不知道它另闢線程,所以自己編寫了一個線程處理函數),因此當串口在等待資料時,不影響主表單或主線程的操作。所以當資料到來時,可以通過Thread.Sleep(100)讓接收函數休息100毫秒,這100毫秒做什麼用呢?就是讓所有的資料都到達B時再讀取,這樣就逃避了分批到達的問題。很明顯,這是在糊弄。因為萬一100毫秒都不夠呢?所以,方法二更合適。

 

代碼

1 private void comm_DataReceived(objectsender, EventArgs e)
2 {
3 Thread.Sleep(100); //等待100毫秒
4   int nReviceBytesNum =comm.BytesToRead; ///收到的位元組數。
5   byte[] ReadBuf = new byte[nReviceBytesNum]; ///定義接收位元組數組
6   comm.Read(ReadBuf, 0, nReviceBytesNum); ///接收資料
7  }

方法二:使用緩衝機制完成。首先通過定義一個成員變數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);
}
}
}

 

在方法二中,有一句“執行其他代碼,對資料進行處理”,如果這些代碼涉及到主線程的控制項比如Label,TextBox,就要涉及跨線程訪問控制項的問題。(串口的DataReceived方法會建立新線程,這在本文開始時已經說明)對於跨線程訪問及更改控制項屬性,也有兩種方法,下一篇文章再介紹。

 

本文不足之處還請各位大蝦指正,本人尚在上學,學識太淺。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.