private SerialPort serialPort;//串口對象類 private string strPortDataReceived = "";//記錄串口返回值 private string serialPortName = "";//記錄端口號 private bool isGet = false; /// <summary> /// 獲取產品設備號 /// </summary> /// <returns>設備號</returns> public List<string> GetProductNumBySerialPort() { List<string> productNumList = new List<string>(); string[] ports = SerialPort.GetPortNames(); if (ports.Length > 0) { for (int i = 0; i < ports.Length; i++) { string portName = ports[i]; serialPort = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One); //serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);//DataReceived事件委托 serialPort.ReceivedBytesThreshold = 1; serialPort.RtsEnable = true; serialPort.WriteTimeout = 500; serialPort.ReadTimeout = 500; try//這里寫成異常處理的形式以免串口打不開程序崩潰 { serialPort.Open(); } catch { } if (serialPort.IsOpen) { //byte[] ar = StringToByteHelper.HexStringToByteArray("1F1109"); byte[] WriteBuffer = new byte[] { 0x1F, 0x11, 0x09 }; try { serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);//獲取設備編號 } catch (Exception ex) { string str = ExceptionClass.GetExceptionMsg(ex, "串口讀寫超時"+ "\r\n"); ExceptionClass.WriteException(str); }//Thread.Sleep(100); int r = 0; //讀取返回數據 while (serialPort.BytesToRead == 0) { r++; Thread.Sleep(1); if (r >= 500) { break; } } Thread.Sleep(50); //50毫秒內數據接收完畢,可根據實際情況調整 r = 0; byte[] recData = new byte[serialPort.BytesToRead]; serialPort.Read(recData, 0, recData.Length); string strPortDataReceived = System.Text.Encoding.Default.GetString(recData); Console.WriteLine(strPortDataReceived); if (strPortDataReceived.Length >= 17) { productNumList.Add(strPortDataReceived.Substring(2, 4)); } serialPort.Close();//關閉該端口 } else { //MessageBox.Show("串口打開失敗!"); //return false; } } } else { //MessageBox.Show("沒有可用的串口!"); } return productNumList; }