using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace SimpleCommunication { public class Serial : IDisposable { #region DataMember & Ctor public SerialPort serialPort; private string[] port; public SerialPort Comm { get; private set; } private List list = new List(4096); //在事务处理结束后才触发下列事件 public event DlgNoParam ComOpenEvent; public event DlgOneParam RecvMsgEvent; public event DlgOneParam SendMsgEvent; public event DlgNoParam ComDisconnectEvent; public bool IsOpen => (serialPort != null && serialPort.IsOpen) ? true : false; public Serial() { serialPort = new SerialPort(); } #endregion /// /// 获取窗口名 /// /// public string getUserPortName() { return serialPort.PortName; } /// /// 加载串口 /// /// public void LoadComSerial(ComboBox ComPort) { ComPort.Items.Clear(); list.Clear(); if (!IsOpen) { port = SerialPort.GetPortNames(); for (int i = 0; i < port.Count(); i++) { try { SerialPort serialPort = new SerialPort(port[i]); serialPort.Open(); serialPort.Close(); list.Add(port[i]); } catch { } } port = list.ToArray(); Array.Sort(port); ComboBox.ObjectCollection items = ComPort.Items; object[] items2 = port; items.AddRange(items2); if (port.Length != 0) { ComPort.Text = port[0]; } } else { ComPort.Text = getUserPortName(); } } /// /// 打开串口 /// /// /// /// /// /// public void OpenSerialPort(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits) { serialPort.PortName = portName; serialPort.BaudRate = baudRate; serialPort.Parity = parity; serialPort.DataBits = dataBits; serialPort.StopBits = stopBits; try { serialPort.ReadBufferSize = 4096; serialPort.DataReceived += ComReceived; serialPort.Open(); if (ComOpenEvent != null) { ComOpenEvent(); } } catch (Exception) { MessageBox.Show("串口被占用,请重新选择!"); } } /// /// 关闭串口 /// public void CloseSeriaPort() { serialPort.DataReceived -= ComReceived; serialPort.Close(); } /// /// /// /// /// private void ComReceived(object sender, SerialDataReceivedEventArgs e) { try { if (serialPort.IsOpen) { string text = ""; Thread.Sleep(50); int length = serialPort.BytesToRead; byte[] data = new byte[length]; serialPort.Read(data, 0, length); //对串口接收数据的处理,可对data进行解析 string data1 = string.Empty; for (int i = 0; i < length; i++) { data1 += Convert.ToString(data[i], 16).ToUpper(); //data.AppendText(str.Length == 1 ? "0" + str + " " : str + " ");//将接收到的数据以十六进制显示到文本框内 } //int bytesToRead = serialPort.BytesToRead; //string data = string.Empty; //while (serialPort.BytesToRead > 0) //{ // data += serialPort.ReadExisting(); //数据读取,直到读完缓冲区数据 //} //for (int i = 0; i < bytesToRead; i++) //{ // int utf = serialPort.ReadByte(); // //text = serialPort.ReadTo("\r"); // string text2 = char.ConvertFromUtf32(utf); // text += text2; //} if (this.RecvMsgEvent != null) { this.RecvMsgEvent(data1); } } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } /// /// 同步发送返回数据 /// /// /// public string SendReturnData(string str) { string text = ""; try { if (serialPort.IsOpen) { serialPort.Write(str); Thread.Sleep(100); text = serialPort.ReadTo("\r"); } } catch (Exception ex) { } return text; } /// /// 发送字符串 /// /// public void SendString(string str) { try { serialPort.Write(str); if (this.SendMsgEvent != null) { this.SendMsgEvent(str); } } catch (Exception ex) { //MessageBox.Show(ex.ToString()); } } /// /// /// 在已连接条件下关闭本地连接和资源释放时调用 /// public void Dispose() { if (serialPort != null&& serialPort.IsOpen) { CloseSeriaPort(); if (this.ComDisconnectEvent != null) { this.ComDisconnectEvent(); } } } } }