一、可能需要的軟件:
1、虛擬串口vspd(Virtual Serial Port Driver,用來在電腦上虛擬出一對串口,模擬通訊。
2、友善串口調試助手,用來發送、讀取數據。
二、思路
1、查詢本機所有的串口
2、判斷需要的串口是否存在本機的串口中
3、設置串口的參數,如波特率、奇偶校驗等。
4、打開串口,
5、通過串口讀取數據,處理數據
6、關閉當前窗口時,將串口一並關閉。
7、可以寫一個定時器,來循環執行1、2兩步,並判斷串口是否打開,以保持串口通訊正常。
三,代碼
1、查詢本機所有的串口
/// <summary> /// 獲取本機串口列表 /// </summary> /// <param name="isUseReg"></param> /// <returns></returns> private List<string> GetComlist(bool isUseReg) { List<string> list = new List<string>(); try { if (isUseReg) { RegistryKey RootKey = Registry.LocalMachine; RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM"); String[] ComNames = Comkey.GetValueNames(); foreach (String ComNamekey in ComNames) { string TemS = Comkey.GetValue(ComNamekey).ToString(); list.Add(TemS); } } else { foreach (string com in SerialPort.GetPortNames()) //自動獲取串行口名稱 list.Add(com); } } catch { MessageBox.Show("串行端口檢查異常!", "提示信息"); // System.Environment.Exit(0); //徹底退出應用程序 } return list; }
2、判斷需要的串口是否存在本機的串口中
/// <summary> /// 判斷是否存在當前串口 /// </summary> private void StartSerialPortMonitor() { List<string> comList = GetComlist(false); //首先獲取本機關聯的串行端口列表 if (comList.Count == 0) { MessageBox.Show("當前設備不存在串行端口!", "提示信息"); // System.Environment.Exit(0); //徹底退出應用程序 } else { string targetCOMPort = "COM8"; //判斷串口列表中是否存在目標串行端口 if (!comList.Contains(targetCOMPort)) { MessageBox.Show("提示信息", "當前設備不存在配置的串行端口!"); //System.Environment.Exit(0); //徹底退出應用程序 } } }
3、設置串口的參數,如波特率、奇偶校驗等。
首先定義字段:
private SerialPort serialPort;
/// <summary> /// 設置通訊串口 /// </summary> public void setcom() { try { StartSerialPortMonitor(); serialPort.PortName = "COM8"; //通信端口 serialPort.BaudRate = 9600; //串行波特率 serialPort.DataBits = 8; //每個字節的標准數據位長度 serialPort.StopBits = StopBits.Two; //設置每個字節的標准停止位數 serialPort.Parity = Parity.None; //設置奇偶校驗檢查協議 //下面這句是當信息中有漢字時,能正確傳輸,不然會出現問號。 serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312"); //串口控件成員變量,字面意思為接收字節閥值, //串口對象在收到這樣長度的數據之后會觸發事件處理函數 //一般都設為1 serialPort.ReceivedBytesThreshold = 1; serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //設置數據接收事件(監聽) serialPort.Open(); //打開串口 } catch (Exception ex) { MessageBox.Show(ex.Message); } }4、打開串口,
5、通過串口讀取數據,處理數據
/// <summary> /// 通訊有數據進執行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e) { getcom(); }public void getcom() { try { //定義一個字段,來保存串口傳來的信息。 string str = ""; int len = serialPort.BytesToRead; Byte[] readBuffer = new Byte[len]; serialPort.Read(readBuffer, 0, len); str = Encoding.Default.GetString(readBuffer); //如果需要和界面上的控件交互顯示數據,使用下面的方法。其中ttt是控件的名稱。 //this.tttt.Dispatcher.Invoke(new Action(() => //{ // tttt.Text = str ; //})); serialPort.DiscardInBuffer(); //清空接收緩沖區 } catch (Exception ex) { serialPort.Close(); MessageBox.Show(ex.Message); } }6、關閉當前窗口時,將串口一並關閉
private void MainWindow1_Closed(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.Close(); } }
7、可以寫一個定時器,來循環執行1、2兩步,保持串口通訊正常。
如果電腦不存在串口,提示警告 如果目標串口不在電腦的串口列表里,提示警告, 如果目標串口當前是關閉的狀態,將其打開。 如果串口已經打開,再次打開會報錯,無法正常工作。一定要注意。
if (!serialPort.IsOpen) { serialPort.Open(); }