WinForm—串口通訊


ialPort(串行端口資源)

 

常用屬性:

BaudRate  此串行端口上要使用的波特率

DataBits  每發送/接收一個字節的數據位數目

DtrEnable  在通訊過程中是否啟用數據終端就緒(Str)行

PortName  要打開的通訊端口的名稱

RtsEnable  在通訊過程中是否啟用請求發送(Rts)行

StopBits  每發送/接收一個字節的停止位數

 常用事件:

DataReceived  每次從SerialPort接收數據時引發

 

 

應用:

0、查詢串口 並加載

1、打開串口

2、發送數據

3、接收數據

 1 //SerialPort數據讀取
 2         private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
 3         {
 4             //此項目接收數據每12位為一組,並以“02”為開始標識符,第2到第7位的最后一個數字為傳輸的數據
 5 
 6             //延遲100ms執行,為了防止SerialPort獲取數據時,獲取到的數據少於12位,顯示框不顯示數據問題
 7             Thread.Sleep(100);
 8             //當接收到的數據>=12位,即一個完整的數據時,再進行數據讀取分析
 9             if (serialPort1.BytesToRead >= 12)
10             {
11                 try
12                 {
13                     //將緩存區的數據放入by數組中
14                     byte[] by = new byte[serialPort1.BytesToRead];
15                     while (serialPort1.BytesToRead > 0)
16                     {
17                         //★★★端口控件讀取數據★★★
18                         serialPort1.Read(by, 0, by.Length);
19                     }
20                     //result為最終顯示結果
21                     string result = "";
22                     //循環判斷by數組,找到開始標識符“02”
23                     for (int j = 0; j < by.Length; j++)
24                     {
25                         //將當前數據轉換為16進制字符串后,不足2位的向左用“0”補齊
26                         string currentby = Convert.ToString(by[j], 16).PadLeft(2, '0');
27                         //如果當前為數據開始標識符,則讀取分析數據
28                         if (currentby == "02")
29                         {
30                             //當剩余數據包換一個完整的12位數據時進行讀取分析
31                             if (by.Length - j > 11)
32                             {
33                                 //第2位開始到第7位結束,共6位為傳輸的數據
34                                 for (int k = j + 2; k <= j + 7; k++)
35                                 {
36                                     currentby = Convert.ToString(by[k], 16).PadLeft(2, '0');
37                                     result += currentby.Substring(1, 1);
38                                     //前三位為整數部分,后三位為小數部分
39                                     if (k == j + 4)
40                                     {
41                                         result += ".";
42                                     }
43                                 }
44                             }
45                             //展示數據
46                             txt_Weight.Text = (Convert.ToDecimal(result)).ToString();
47                             break;
48                         }
49                     }
50                 }
51                 catch (Exception ex)
52                 {
53                     MessageBox.Show(ex.ToString());
54                 }
55             }
56         }
SerialPort控件數據讀取

4、數據接收錯誤

錯誤:將返回的數據處理后倒入指定的文本框,因線程問題出現錯誤

 

解決方案:Form.CheckForIllegalCrossThreadCalls = false;

 


免責聲明!

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



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