using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.IO.Ports; namespace StandardLibrary { interface IUART { /// /// 获取或设置串口的串口号 /// string PortName { get; set; } /// /// 获取或设置波特率 /// int BaudRate { get; set; } /// /// 获取或设置串口的校验位 /// Parity Parity { get; set; } /// /// 获取或设置串口的数据位 /// int DataBits { get; set; } /// /// 获取或设置串口的停止位 /// StopBits StopBits { get; set; } /// /// 获取串口的打开状态 /// bool OpenStatus { get; } /// /// 打开串口 /// /// true 打开成功,false 打开失败 bool Open(); /// /// 关闭串口 /// /// true 关闭成功,false 关闭异常 bool Close(); /// /// 发送数据 /// /// 字符串数据 /// true 发送成功,false 发送失败 bool Send(string message); /// /// 发送数据 /// /// 字节数组数据 /// true 发送成功,false 发送失败 bool Send(byte[] message); /// /// 接收数据解码 /// /// 接收数据字节数组 void ReceiveDataDecode(byte[] data); } public class UART : IUART { public int UartIndex; public object obj = null; #region 字段 /// /// 实例化串口 /// protected SerialPort serialPort = new SerialPort(); /// /// 接收数据事件 /// public Action ReceiveDataDecodeEvent; #endregion #region 属性 /// /// 获取或设置串口的串口号 /// public string PortName { get { return serialPort.PortName; } set { serialPort.PortName = value; } } /// /// 获取或设置串口的波特率 /// public int BaudRate { get { return serialPort.BaudRate; } set { serialPort.BaudRate = value; } } /// /// 获取或设置串口的校验位 /// public Parity Parity { get { return serialPort.Parity; } set { serialPort.Parity = value; } } /// /// 获取或设置串口的数据位 /// public int DataBits { get { return serialPort.DataBits; } set { serialPort.DataBits = value; } } /// /// 获取或设置串口的停止位 /// public StopBits StopBits { get { return serialPort.StopBits; } set { serialPort.StopBits = value; } } /// /// 获取串口的打开状态 /// public bool OpenStatus { get { return serialPort.IsOpen; } } #endregion /// /// 构造函数,设置串口属性及订阅接收事件 /// /// 串口号 /// 波特率 /// 校验位 /// 数据位 /// 停止位 public UART(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, int uartIndex) { this.UartIndex = uartIndex; //编号 this.PortName = portName; //串口号 this.BaudRate = baudRate; //波特率 this.Parity = parity; //校验位 this.DataBits = dataBits; //数据位 this.StopBits = stopBits; //停止位 serialPort.DataReceived += Received;//订阅串口接收事件 } /// /// 打开串口 /// /// true 打开成功,false 打开失败 public virtual bool Open() { string[] str = SerialPort.GetPortNames(); //获取当前计算机的所有串口号 if (str != null && str.Contains(PortName)) //判断当前计算机是否有串口以及是否存在将要打开的串口 { try { serialPort.ReceivedBytesThreshold = 1; //设置接收事件字节数 if (serialPort.IsOpen) serialPort.Close(); serialPort.Open(); //打开串口 serialPort.DiscardInBuffer(); //清空接收缓存区的数据 return true; //串口打开成功 } catch (Exception) { return false; } //异常,串口打开失败 } else { return false; } //当前计算机没有串口或将要打开的串口不存在,串口打开失败 } /// /// 关闭串口 /// /// true 关闭成功,false 关闭失败 public virtual bool Close() { try { serialPort.Close(); //关闭串口连接 return true; //关闭成功 } catch { return false; } //异常,关闭失败 } /// /// 发送数据 /// /// 字符串数据 /// true 发送成功,false 发送失败 public virtual bool Send(string message) { try { serialPort.Write(message); //发送字符串数据 return true; //发送成功 } catch { return false; } //异常,发送失败 } /// /// 发送数据 /// /// 字节数组数据 /// true 发送成功,false 发送失败 public virtual bool Send(byte[] message) { try { serialPort.Write(message, 0, message.Length); //发送字节数组数据 return true; //发送成功 } catch { return false; } //异常,发送失败 } /// /// 接收数据 /// /// /// //protected virtual void Received(object sender, SerialDataReceivedEventArgs e) //{ // int length = serialPort.BytesToRead; // byte[] buf = new byte[length]; //创建接收数据存储区 // serialPort.Read(buf, 0, length); //将接收缓存区中的数据读取到数据存储区 // serialPort.DiscardInBuffer(); //清空接收缓存区的数据 // ReceiveDataDecode(buf); //调用接收数据解码函数,处理接收数据 //} protected virtual void Received(object sender, SerialDataReceivedEventArgs e) { List tempBytes = new List(); while(serialPort.BytesToRead > 0) { byte[] buffer = new byte[serialPort.BytesToRead]; serialPort.Read(buffer, 0, buffer.Length); foreach(byte b in buffer) { tempBytes.Add(b); } Thread.Sleep(20); } byte[] dataBuf = tempBytes.ToArray(); ReceiveDataDecode(dataBuf); //调用接收数据解码函数,处理接收数据 } /// /// 接收数据解码 /// /// 接收到的数据 public virtual void ReceiveDataDecode(byte[] data) { if (ReceiveDataDecodeEvent != null) //判断事件是否被订阅 ReceiveDataDecodeEvent(this.UartIndex,data); //如果被订阅,就发布事件 } } }