當需要編程操縱硬件時會遇到過這樣的問題,就是通過串口來接收硬件發來的數據,或是通過串口向硬件發送某種格式的命令。在C#平台上,可以通過 System.IO.Ports 命名空間下的SerialPort 類來實現。
下面是我做過的一個簡單的示例,首先獲取本機關聯的串行端口列表,然后獲取配置文件中配置的COM端口,檢查是否在本機串行端口列表中,若在列表中則進一步實例化串口對象,並為串口對象指定數據接收事件來實現監聽,示例代碼如下:
using System.IO.Ports; namespace SerialTest { public class SerialTest { #region 串口監聽 private SerialPort serialPort = null; /// <summary> /// 開啟串口監聽 /// </summary> private void StartSerialPortMonitor() { List<string> comList = GetComlist(false); //首先獲取本機關聯的串行端口列表 if (comList.Count == 0) { DialogForm.Show("提示信息", "當前設備不存在串行端口!"); System.Environment.Exit(0); //徹底退出應用程序 } else { string targetCOMPort = ConfigurationManager.AppSettings["COMPort"].ToString(); //判斷串口列表中是否存在目標串行端口 if (!comList.Contains(targetCOMPort)) { DialogForm.Show("提示信息", "當前設備不存在配置的串行端口!"); System.Environment.Exit(0); //徹底退出應用程序 } serialPort = new SerialPort(); //設置參數 serialPort.PortName = ConfigurationManager.AppSettings["COMPort"].ToString(); //通信端口 serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings["BaudRate"].ToString()); //串行波特率 serialPort.DataBits = 8; //每個字節的標准數據位長度 serialPort.StopBits = StopBits.One; //設置每個字節的標准停止位數 serialPort.Parity = Parity.None; //設置奇偶校驗檢查協議 serialPort.ReadTimeout = 3000; //單位毫秒 serialPort.WriteTimeout = 3000; //單位毫秒 //串口控件成員變量,字面意思為接收字節閥值, //串口對象在收到這樣長度的數據之后會觸發事件處理函數 //一般都設為1 serialPort.ReceivedBytesThreshold = 1; serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //設置數據接收事件(監聽) try { serialPort.Open(); //打開串口 } catch (Exception ex) { DialogForm.Show("提示信息", "串行端口打開失敗!具體原因:" + ex.Message); System.Environment.Exit(0); //徹底退出應用程序 } } } /// <summary> /// 串口數據處理函數 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e) { try { //Comm.BytesToRead中為要讀入的字節長度 int len = serialPort.BytesToRead; Byte[] readBuffer = new Byte[len]; serialPort.Read(readBuffer, 0, len); //將數據讀入緩存 //處理readBuffer中的數據,自定義處理過程 string msg = encoding.GetString(readBuffer, 0, len); //獲取出入庫產品編號 DialogForm.Show("接收到的信息", msg); } catch(Exception ex) { DialogForm.Show("提示信息", "接收返回消息異常!具體原因:" + ex.Message); } } /// <summary> /// 關閉串口 /// </summary> private void Stop() { serialPort.Close(); } /// <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 { DialogForm.Show("提示信息", "串行端口檢查異常!"); System.Environment.Exit(0); //徹底退出應用程序 } return list; } #endregion 串口監聽 } }