效果圖:
====================== 代碼段 =================================
public partial class SerialPortEx : Form { private SerialPort sp = new SerialPort(); bool isOpen = false; // bool isSetProperty = false; //屬性設置標志 bool isHex = false; //十六進制顯示標志 bool isFileOpen = false; string RecvDataText = null; public SerialPortEx() { InitializeComponent(); } private void SerialPort_Load(object sender, EventArgs e) //串口列表 { for (int i = 0; i < 6; i++) { cbxComPort.Items.Add("COM" + (i + 1).ToString()); } cbxComPort.SelectedIndex = 0; //設置串口初始值 //列出常用的波特率表 cbxBaudRate.Items.Add("1200"); cbxBaudRate.Items.Add("2400"); cbxBaudRate.Items.Add("4800"); cbxBaudRate.Items.Add("9600"); cbxBaudRate.Items.Add("19200"); cbxBaudRate.Items.Add("38400"); cbxBaudRate.SelectedIndex = 5; //列出停止位 cbxStopBits.Items.Add("0"); cbxStopBits.Items.Add("1"); cbxStopBits.Items.Add("1.5"); cbxStopBits.Items.Add("2"); cbxStopBits.SelectedIndex = 1; //列出數據位 cbxDataBits.Items.Add("8"); cbxDataBits.Items.Add("7"); cbxDataBits.Items.Add("6"); cbxDataBits.Items.Add("5"); cbxDataBits.SelectedIndex = 1; //列出奇偶校驗位 cbxParity.Items.Add("無"); cbxParity.Items.Add("奇校驗"); cbxParity.Items.Add("偶校驗"); cbxParity.SelectedIndex = 0; //默認char顯示 rbnChar.Checked = true; } private void textBox1_TextChanged(object sender, EventArgs e) { } private void btnCheckCom_Click(object sender, EventArgs e) //檢測Com口 { bool comExist = false; cbxComPort.Items.Clear(); for (int i = 0; i < 10; i++) { try { SerialPort sp = new SerialPort("COM" + (i + 1).ToString()); sp.Open(); sp.Close(); cbxComPort.Items.Add("COM" + (i + 1).ToString()); comExist = true; } catch (Exception) { continue; } } if (comExist) { cbxComPort.SelectedIndex = 0; //默認第一個 } else { MessageBox.Show("沒有找到任何可用串口", "錯誤提示"); } } //串口檢測 界面初始化 private bool CheckPortSetting() //檢測串口是否初始化 { if (cbxComPort.Text.Trim() == "") return false; if (cbxBaudRate.Text.Trim() == "") return false; if (cbxDataBits.Text.Trim() == "") return false; if (cbxParity.Text.Trim() == "") return false; if (cbxStopBits.Text.Trim() == "") return false; return true; } private bool CheckSendDate() //檢測發送數據是否為空 { if (tbxSentData.Text.Trim() == "") return false; return true; } private void SetPortProperty() // { sp = new SerialPort(); sp.PortName = cbxComPort.Text.Trim(); //設置串口名 sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim()); //設置串口波特率 int f = (int)Convert.ToSingle(cbxStopBits.Text.Trim()) * 10; //設置停止位 switch (f) { case 0: sp.StopBits = StopBits.None; break; case 10: sp.StopBits = StopBits.One; break; case 15: sp.StopBits = StopBits.OnePointFive; break; case 20: sp.StopBits = StopBits.Two; break; default: sp.StopBits = StopBits.None; break; } sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim()); //設置數據位 string parityType = cbxParity.Text.Trim(); //設置奇偶校驗 switch (parityType) { case "無": sp.Parity = Parity.None; break; case "奇校驗": sp.Parity = Parity.Odd; break; case "偶校驗": sp.Parity = Parity.Even; break; default: sp.Parity = Parity.None; break; } sp.ReadTimeout = -1; //超時讀取時間 sp.RtsEnable = true; // 指示本設備准備好可接收數據 //定義Data Received事件,當串口收到數據后出發事件 sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); } private void btnOpenCom_Click(object sender, EventArgs e) { if (isOpen == false) { if (!CheckPortSetting()) //檢測串口設置 { MessageBox.Show("串口未設置", "錯誤提示"); return; } if (isSetProperty == false) // 檢測 { SetPortProperty(); isSetProperty = true; } try //打開串口 { sp.Open(); isOpen = true; btnOpenCom.Text = "關閉串口"; //串口打開后相關的串口設置按鈕不再可選擇 cbxBaudRate.Enabled = false; cbxComPort.Enabled = false; cbxDataBits.Enabled = false; cbxParity.Enabled = false; cbxStopBits.Enabled = false; } catch (Exception) { //失敗后設置 isSetProperty = false; isOpen = false; MessageBox.Show("串口無效或已經被占用!", "錯誤提示"); } } else { sp.Close(); isOpen = false; isSetProperty = false; btnOpenCom.Text = "打開串口"; //重置選擇按鈕有效 cbxBaudRate.Enabled = true; cbxComPort.Enabled = true; cbxDataBits.Enabled = true; cbxParity.Enabled = true; cbxStopBits.Enabled = true; } } private void btnSend_Click(object sender, EventArgs e) { try { System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(); byte[] writeBytes = utf8.GetBytes(tbxSentData.Text); //byte[] writeBytes11 = new Byte[data1.length]; // sp.Write(writeBytes,0,writeBytes.Length); //發送數據內容 } catch (Exception) { MessageBox.Show("發送數據時發生錯誤!", "錯誤提示"); return; } } private void sp_DataReceived(object sender, EventArgs e) { System.Threading.Thread.Sleep(100); //延遲100ms等待接收完成數據 this.Invoke((EventHandler)( delegate { if (isHex == false) { System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();// 顯示漢字與字符 Byte[] readBytes = new Byte[sp.BytesToRead]; sp.Read(readBytes, 0, readBytes.Length); string decodedString = utf8.GetString(readBytes); tbxRecvData.Text += decodedString; } else { } } )); } }
===========================================================
未完待續:
添加接收信息換行,中文字符處理....