using ProjectBase.Data.Logs; using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SIMDP.Device { public class SerialPortHelper { public event EventSerialDataReceiveHandler serialDataReceived; /// /// 串口连接反馈事件 /// /// public delegate void EventSerialOpenHandler(bool isOpen); /// /// 串口连接反馈事件 /// /// public event EventSerialOpenHandler serialOpen; private int interval = 1000; private System.Timers.Timer timer = null; private SerialPort serialPort; private Thread thread; volatile bool _keepReading; // 串口是否打开 public bool IsOpen { get { return serialPort.IsOpen; } } public SerialPortHelper() { } /// /// 串口通信 /// /// 端口号 /// 波特率 /// 数据位 public SerialPortHelper(string PortNumber, int baudRate, int DataBits) { serialPort = new SerialPort(); thread = null; serialPort.PortName = PortNumber; // 波特率 serialPort.BaudRate = baudRate; // 数据位 serialPort.DataBits = DataBits; // 两个停止位 serialPort.StopBits = System.IO.Ports.StopBits.One; // 无奇偶校验位 serialPort.Parity = System.IO.Ports.Parity.None; serialPort.ReadTimeout = 100; serialPort.WriteTimeout = -1; //timer = new System.Timers.Timer(interval); //timer.Elapsed += Refresh_Elapsed; //timer.Start(); Open(); } /// /// 开启定时器 /// //public void TimerStart() //{ // timer = new System.Timers.Timer(interval); // timer.Elapsed += Refresh_Elapsed; // if (!timer.Enabled) // { // timer.Start(); // } // Open(); //} /// /// 定时刷新 /// /// /// //private void Refresh_Elapsed(object sender, ElapsedEventArgs e) //{ // if (!IsOpen) // { // LogHelper.log.Debug("重新打开串口程序"); // Open(); // } //} /// /// 开始接收数据 /// private void StartReading() { if (!_keepReading) { _keepReading = true; thread = new Thread(new ThreadStart(ReadPort)); thread.IsBackground = true; thread.Start(); } } /// /// 停止读取数据 /// public void StopReading() { if (_keepReading) { timer.Stop(); _keepReading = false; thread.Abort(); thread.Join(); thread = null; LogHelper.log.Debug("关闭接收线程。"); } } /// /// 数据接收 /// private void ReadPort() { LogHelper.log.Debug("开始接收数据。"); //START: while (_keepReading) { int offset = 0; int timeout = 0; byte[] readBuffer = new byte[1024 * 8]; while (IsOpen) { int count = serialPort.BytesToRead; if (count > 0) { if ((offset + count) > 1024 * 8) { break; } int readCount = serialPort.Read(readBuffer, offset, count); offset += readCount; timeout = 0; } else { break; } if (timeout > 100) { break; } timeout++; } string strData = System.Text.Encoding.Default.GetString(readBuffer).TrimEnd('\0'); if (!string.IsNullOrEmpty(strData)) { if (serialDataReceived != null) { SerialPortDataReceiveEventArgs receive = new SerialPortDataReceiveEventArgs(strData); serialDataReceived(receive); } LogHelper.log.Debug("接收数据完成 。"); } } } /// /// 串口打开 /// private void Open() { try { serialPort.Open(); if (IsOpen) { _keepReading = false; StartReading(); } else { LogHelper.log.Error("串口打开失败, 重新打开"); serialPort.Close(); Open(); } if (serialOpen != null) { serialOpen(IsOpen); } } catch (Exception ex) { LogHelper.log.Error("打开串口时出现错误,错误为", ex); } } /// /// 串口关闭 /// public void Close() { StopReading(); serialPort.Close(); if (serialOpen != null) { serialOpen(IsOpen); } } /// /// 串口写入数据 /// /// /// /// public void WritePort(byte[] send, int offSet, int count) { if (IsOpen) { LogHelper.log.Debug("开始写入数据。"); serialPort.Write(send, offSet, count); } } } /// /// 串口接收数据 /// public delegate void EventSerialDataReceiveHandler(SerialPortDataReceiveEventArgs e); public class SerialPortDataReceiveEventArgs : EventArgs { public string Value { get; set; } public SerialPortDataReceiveEventArgs(string value) { this.Value = value; } } }