1:獲取所有串口名稱並排序
string[] ports = SerialPort.GetPortNames();
Array.Sort(ports);
2:設置串口通信參數並打開串口
// 創建串口實例 private SerialPort comm = new SerialPort(); // 設置端口名稱、波特率、校驗位、停止位等參數 comm.PortName = cmbPortName.Text; comm.BaudRate = int.Parse(cmbRate.Text); // 打開串口 try { comm.Open(); } catch (Exception ex) { //捕獲到異常信息,創建一個新的comm對象,之前的不能用了。 comm = new SerialPort(); //將異常信息傳遞給用戶。 MessageBox.Show(ex.Message); }
3:串口接收數據
private long received_count = 0;//接收計數
List<string> receiveString = new List<string>();
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = comm.BytesToRead;//先記錄下來,避免某種原因,人為的原因,操作幾次之間時間長,緩存不一致 byte[] buf = new byte[n];//聲明一個臨時數組存儲當前來的串口數據 received_count += n;//增加接收計數 comm.Read(buf, 0, n);//讀取緩沖數據 builder.Clear();//清除字符串構造器的內容 //因為要訪問ui資源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判斷是否是顯示為16進制 if (checkBoxHexView.Checked) { //依次的拼接出16進制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII規則轉換成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,並滾動到最后。 //this.txtHistoryText.AppendText(builder.ToString()); receiveString.Add(builder.ToString()); // txtHistoryText.ScrollToCaret(); //修改接收計數 labelGetCount.Text =received_count.ToString(); comm_DataSend(receiveString[receiveString.Count-1]); })); }
4:串口發送數據
private long send_count = 0;//發送計數
// 要發送的消息 void comm_DataSend(string receiveMessage) { //定義一個變量,記錄發送了幾個字節 int n = 0; //16進制發送 if (checkBoxHexSend.Checked) { //我們不管規則了。如果寫錯了一些,我們允許的,只用正則得到有效的十六進制數 MatchCollection mc = Regex.Matches(GetSendMessage(receiveMessage), @"(?i)[\da-f]{2}"); List<byte> buf = new List<byte>();//填充到這個臨時列表中 //依次添加到列表中 foreach (Match m in mc) { //buf.Add(byte.Parse(m.Value)); buf.Add(byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber)); } //轉換列表為數組后發送 comm.Write(buf.ToArray(), 0, buf.Count); //記錄發送的字節數 n = buf.Count; } else//ascii編碼直接發送 { //包含換行符 if (checkBoxNewlineSend.Checked) { comm.WriteLine(GetSendMessage(receiveMessage)); n = GetSendMessage(receiveMessage).Length + 2; } else//不包含換行符 { comm.Write(GetSendMessage(receiveMessage)); n = GetSendMessage(receiveMessage).Length; } } send_count += n;//累加發送字節數 labelSendCount.Text =send_count.ToString();//更新界面 }
5:關閉串口
comm.Close();