您的位置:首頁>正文

基於多執行緒方式的串列通信介面資料接收案例

基於多執行緒方式的串列通信介面資料接收案例

廣東職業技術技術學院 歐浩源

1、案例背景

在本博客的《【CC2530入門教程-06】CC2530的ADC工作原理與應用》中實現了電壓資料獲取的程式設計, 感測器模組以每1秒發送一幀資料的形式通過串口向上位機發送電壓資料。 其資料幀由4個位元組組成:一個幀頭和一個幀尾, 中間兩個位元組為電壓資料, 其格式如下:

幀頭(0xAF) 電壓資料高8位元 電壓資料低8位元 幀尾(0xFA)

在篇博文中, 將講述如何通過多執行緒的方式, 從串口接收感測器發送過來的資料幀, 並將資料幀和換算後的實際電壓值顯示出來。

2、介面設計

3、引入命令空間

使用多執行緒的方式, 需要引入命名空間:System.Threading;

使用串列通信介面, 需要引入命名空間:System.IO.Ports;

4、初始化工作

首先, 定義一個序列介面的物件和一個執行緒的欄位,

然後, 給主表單添加表單裝載事件(即Load事件), 在該事件中對各個控制項的屬性進行初始化工作。

SerialPort com = new SerialPort; //產生實體一個串口物件 Thread t; //定義一個執行緒欄位 private void Form1_Load(object sender, EventArgs e) { textBox1.ReadOnly = true; //文字方塊唯讀 textBox1.ScrollBars = ScrollBars.Vertical; //文字方塊支持垂直捲動條 comboBox1.Items.Add("COM1"); comboBox1.Items.Add("COM2"); comboBox1.Items.Add("COM3"); comboBox1.Items.Add("COM4"); comboBox1.Items.Add("COM5"); comboBox1.SelectedIndex = 2; comboBox2.Items.Add("4800"); comboBox2.Items.Add("9600"); comboBox2.Items.Add("19200"); comboBox2.Items.Add("57600"); comboBox2.Items.Add("115200"); comboBox2.SelectedIndex = 1; comboBox3.Items.Add("6"); comboBox3.Items.Add("7"); comboBox3.Items.Add("8"); comboBox3.SelectedIndex = 2; comboBox4.Items.Add("1"); comboBox4.Items.Add("1.5"); comboBox4.Items.Add("2"); comboBox4.SelectedIndex = 0; }

5、設置序列介面

在進行串口通信的時候, 一般的流程是:先設置通信的埠號、串列傳輸速率、資料位元、停止位元和校驗位, 然後打開串口, 接著發送資料和接收資料, 最後要關閉串口。

在本案例中, 對串口的各個參數配置完成後, 打開串口, 然後啟動串口資料接收的執行緒, 開始以輪詢的方式接收資料。

private void button1_Click(object sender, EventArgs e) { if (button1.Text == "打開串口") { com.PortName = comboBox1.Text; //選擇串口號 com.BaudRate = int.Parse(comboBox2.Text); //選擇串列傳輸速率 com.DataBits = int.Parse(comboBox3.Text); //選擇資料位元數 com.StopBits = (StopBits)int.Parse(comboBox4.Text); //選擇停止位數 com.Parity = Parity.None; //選擇是否同位 try { if (com.IsOpen) //判斷該串口是否已打開 { com.Close; com.Open; } else { com.Open; } t = new Thread(com_DataReceived); //創建並啟用資料接收執行緒 t.Start; } catch(Exception ex) { MessageBox.ReferenceEquals("錯誤:" + ex.Message, "串口通信"); } button1.Text = "關閉串口"; } else if (button1.Text == "關閉串口") { com.Close; //關閉串口 t.Abort; //終止執行緒 button1.Text = "打開串口"; } }

6、串口資料接收執行緒方法

在該方法中, 只有在串口打開並連接成功的情況下在去讀取串口緩衝區中的資料。

首先通過讀取BytesToRead屬性, 獲取串口接收緩衝區中的資料位元組數, 然後根據這個屬性產生實體一個byte類型的資料, 在通過Read方法將資料從緩衝區中讀取到陣列中。

將資料幀以十六進位的形式顯示到表單的文字方塊中。

通過計算獲得實際的電壓值, 顯示到對應的Lable標籤中。

private void com_DataReceived { while (com.IsOpen) //在串口已打開情況下讀取資料 { string strRcv = ""; int count = com.BytesToRead; //獲取串口緩衝器的位元組數 byte readBuffer = new byte[count]; //產生實體接收串口資料的陣列 if (count != 0) //如果串口接收到資料 { strRcv = count.ToString + " "; com.Read(readBuffer, 0, count); //從串口緩衝區讀出資料到陣列 for (int i = 0; i

7、程式運行結果

8、結語

序列介面通信是物聯網技術應用中常用的資料對話模式。

利用多執行緒的手段以輪詢的方式讀取串口緩衝區的資料是一種最基礎的方法, 然而並不是唯一的方法。 採用DadaReceived事件觸發的方法來接收資料也很常用, 當程式設計程度稍微複雜一點, 後面再慢慢講述。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示