C#製作串列埠通訊助手
阿新 • • 發佈:2019-02-10
介面:
程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports;//串列埠名稱空間 using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 串列埠通訊助手 { public partial class Form1 : Form { SerialPort sp = new SerialPort();//建立串列埠全域性變數 //檢測當前可用串列埠函式 private void CheckPort() { cbxPort.Items.Clear();//清除控制元件中當前值 bool haveCOM = false;//用於最終判斷是否有串列埠 string[] a = SerialPort.GetPortNames();//獲取本機的所有串列埠名稱 if (a == null) { haveCOM = false; //無可用串列埠 } else { foreach (string b in a) //將串列埠名稱新增到下拉列表控制元件中 { bool excitent = false; try //開啟串列埠,測試串列埠是否可用 { SerialPort sp = new SerialPort(b); sp.Open(); sp.Close(); excitent = true; } catch { excitent = false; } if (excitent) { cbxPort.Items.Add(b); haveCOM = true; } } } if (haveCOM) { cbxPort.SelectedIndex = 0; } else { MessageBox.Show("無可用串列埠!", "錯誤提示"); } } //設定串列埠函式 private void SetCOM() { try { sp.PortName = cbxPort.Text.Trim();//串列埠名 sp.BaudRate = Convert.ToInt32(cbxBaud.Text.Trim());//波特率 if (cbxParity.Text.Trim() == "奇校驗")//奇偶校驗位 { sp.Parity = Parity.Odd; } else if (cbxParity.Text.Trim() == "偶校驗") { sp.Parity = Parity.Even; } else { sp.Parity = Parity.None; } if (cbxStopBits.Text.Trim() == "1.5")//停止位 { sp.StopBits = StopBits.OnePointFive; } else if (cbxStopBits.Text.Trim() == "2") { sp.StopBits = StopBits.Two; } else { sp.StopBits = StopBits.One; } sp.DataBits = Convert.ToInt16(cbxDataBits.Text.ToString().Trim());//資料位 sp.Encoding = Encoding.UTF8;//設定串列埠通訊的編碼格式,預設ASCII } catch { } } //16進位制字串轉換成ASCII字串 private string HexToASCII(string str) { try { string[] mystr1 = str.Trim().Split(' '); byte[] t = new byte[mystr1.Length]; for (int i = 0; i < t.Length; i++) { t[i] = Convert.ToByte(mystr1[i], 16); } return Encoding.UTF8.GetString(t); } catch (Exception ex) { rbtSendAscii.Select(); MessageBox.Show("轉換失敗!" + ex.Message, "錯誤提示"); return str; } } //字串轉換成16進位制字元 private string ASCIIToHex(string str) { try { byte[] a = Encoding.UTF8.GetBytes(str.Trim()); string mystr1 = ""; for (int i = 0; i < a.Length; i++) { mystr1 += a[i].ToString("X2") + " "; } return mystr1; } catch (Exception ex) { rbtSendAscii.Select(); MessageBox.Show("轉換失敗!" + ex.Message, "錯誤提示"); return str; } } //接收串列埠資料事件 private void COMReceived(object sender,SerialDataReceivedEventArgs e) { Thread.Sleep(100); this.Invoke((EventHandler)(delegate { try { string mystr1 = "[接收] " + DateTime.Now.ToString("yyyyMMddHHmmssfff") + " "; byte[] a = new byte[sp.BytesToRead]; sp.Read(a, 0, a.Length); string mystr2 = Encoding.UTF8.GetString(a); string b = ""; if (rbtReceviedHex.Checked) { b = ASCIIToHex(mystr2); } else { b = mystr2; } tbxReceivedData.Text += mystr1 + b + "\r\n"; statusLabel1.Text = "接收成功!"; } catch { statusLabel1.Text = "接收失敗!"; } })); } //初始化視窗函式 public Form1() { InitializeComponent(); } //載入視窗函式 private void Form1_Load(object sender, EventArgs e) { statusLabel1.Text = "";//狀態條初始化 //設定視窗大小 this.MaximizeBox = false;//隱藏最大化按鈕 this.MaximumSize = this.Size;//固定視窗尺寸最大為當前尺寸 this.MinimumSize = this.Size;//固定視窗尺寸最小為當前尺寸 tbxSendData.Focus();//預設將游標放在傳送文字框上 rbtReceviedAscii.Select();//預設選擇ASCII字元顯示 rbtSendAscii.Select();//預設選擇ASCII字元顯示 CheckPort();//檢測可用串列埠 //初始化波特率 cbxBaud.Items.Clear(); cbxBaud.Items.Add("1200"); cbxBaud.Items.Add("2400"); cbxBaud.Items.Add("4800"); cbxBaud.Items.Add("9600"); cbxBaud.Items.Add("12800"); cbxBaud.Items.Add("19200"); cbxBaud.Items.Add("25600"); cbxBaud.Items.Add("115200"); cbxBaud.SelectedIndex = 5; //初始化校驗位 cbxParity.Items.Clear(); cbxParity.Items.Add("無"); cbxParity.Items.Add("奇校驗"); cbxParity.Items.Add("偶校驗"); cbxParity.SelectedIndex = 0; //初始化停止位 cbxStopBits.Items.Clear(); cbxStopBits.Items.Add("1"); cbxStopBits.Items.Add("1.5"); cbxStopBits.Items.Add("2"); cbxStopBits.SelectedIndex = 0; //初始化資料位 cbxDataBits.Items.Clear(); cbxDataBits.Items.Add("7"); cbxDataBits.Items.Add("8"); cbxDataBits.SelectedIndex = 1; statusLabel1.Text = "";//修改狀態條內容 } //檢測串列埠按鈕事件 private void btnCheckCOM_Click(object sender, EventArgs e) { statusLabel1.Text = "檢測串列埠開始!"; CheckPort(); statusLabel1.Text = "串列埠檢測完成!"; } //開啟串列埠按鈕事件 private void btnOpenCOM_Click(object sender, EventArgs e) { if (btnOpenCOM.Text == "開啟串列埠") { SetCOM();//設定串列埠函式 if (sp.IsOpen) { statusLabel1.Text = "串列埠"+cbxPort.Text+"已開啟!"; } else { try { sp.Open(); //開啟串列埠 //禁用設定控制元件 btnCheckCOM.Enabled = false; cbxPort.Enabled = false; cbxBaud.Enabled = false; cbxParity.Enabled = false; cbxStopBits.Enabled = false; cbxDataBits.Enabled = false; btnOpenCOM.Text = "關閉串列埠"; statusLabel1.Text = "串列埠" + cbxPort.Text + "開啟成功!"; sp.DataReceived += new SerialDataReceivedEventHandler(COMReceived);//定義串列埠接收事件 } catch(Exception ex) { MessageBox.Show("串列埠"+cbxPort.Text+"開啟失敗,失敗原因:"+ex.Message,"錯誤提示"); statusLabel1.Text = "串列埠" + cbxPort.Text + "開啟失敗,失敗原因:" + ex.Message; } } } else //關閉串列埠 { if (sp.IsOpen) //判斷串列埠是否開啟 { try { sp.Close(); //關閉串列埠 //啟用設定控制元件 btnCheckCOM.Enabled = true; cbxPort.Enabled = true; cbxBaud.Enabled = true; cbxParity.Enabled = true; cbxStopBits.Enabled = true; cbxDataBits.Enabled = true; btnOpenCOM.Text = "開啟串列埠"; statusLabel1.Text = "串列埠" + cbxPort.Text + "關閉成功!"; } catch(Exception ex) { MessageBox.Show("串列埠"+ cbxPort.Text + "關閉失敗,錯誤提示:"+ex.Message,"錯誤提示"); statusLabel1.Text = "串列埠" + cbxPort.Text + "關閉失敗,錯誤提示:" + ex.Message; } } else { btnCheckCOM.Enabled = true; cbxPort.Enabled = true; cbxBaud.Enabled = true; cbxParity.Enabled = true; cbxStopBits.Enabled = true; cbxDataBits.Enabled = true; btnOpenCOM.Text = "開啟串列埠"; statusLabel1.Text = "串列埠未開啟,無法關閉!"; MessageBox.Show("串列埠未開啟,無法關閉!","錯誤提示"); } } } //清除按鈕事件 private void btnClear_Click(object sender, EventArgs e) { tbxReceivedData.Text = ""; tbxSendData.Text = ""; } private void rbtSendAscii_CheckedChanged(object sender, EventArgs e) { if (rbtSendAscii.Checked) { tbxSendData.Text= HexToASCII(tbxSendData.Text); } } private void rbtSendHex_CheckedChanged(object sender, EventArgs e) { if (rbtSendHex.Checked) { tbxSendData.Text = ASCIIToHex(tbxSendData.Text.ToString()); } } private void btnSend_Click(object sender, EventArgs e) { try { string mystr1 = tbxSendData.Text; if (rbtSendHex.Checked) { mystr1 = HexToASCII(tbxSendData.Text); } byte[] a = Encoding.UTF8.GetBytes(mystr1); string mystr2 = Encoding.UTF8.GetString(a); sp.Write(mystr2); tbxReceivedData.Text += "[傳送] " + DateTime.Now.ToString("yyyyMMddHHmmssfff") + " " + tbxSendData.Text + "\r\n"; statusLabel1.Text = "傳送成功!"; } catch { statusLabel1.Text = "傳送失敗"; } } } }