123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- 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;
- /// <summary>
- /// 串口连接反馈事件
- /// </summary>
- /// <param name="isOpen"></param>
- public delegate void EventSerialOpenHandler(bool isOpen);
- /// <summary>
- /// 串口连接反馈事件
- /// </summary>
- /// <param name="isOpen"></param>
- 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()
- {
- }
- /// <summary>
- /// 串口通信
- /// </summary>
- /// <param name="PortNumber">端口号</param>
- /// <param name="baudRate">波特率</param>
- /// <param name="DataBits">数据位</param>
- 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();
- }
- /// <summary>
- /// 开启定时器
- /// </summary>
- //public void TimerStart()
- //{
- // timer = new System.Timers.Timer(interval);
- // timer.Elapsed += Refresh_Elapsed;
- // if (!timer.Enabled)
- // {
- // timer.Start();
- // }
- // Open();
- //}
- /// <summary>
- /// 定时刷新
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- //private void Refresh_Elapsed(object sender, ElapsedEventArgs e)
- //{
- // if (!IsOpen)
- // {
- // LogHelper.log.Debug("重新打开串口程序");
- // Open();
- // }
- //}
- /// <summary>
- /// 开始接收数据
- /// </summary>
- private void StartReading()
- {
- if (!_keepReading)
- {
- _keepReading = true;
- thread = new Thread(new ThreadStart(ReadPort));
- thread.IsBackground = true;
- thread.Start();
- }
- }
- /// <summary>
- /// 停止读取数据
- /// </summary>
- public void StopReading()
- {
- if (_keepReading)
- {
- timer.Stop();
- _keepReading = false;
- thread.Abort();
- thread.Join();
- thread = null;
- LogHelper.log.Debug("关闭接收线程。");
- }
- }
- /// <summary>
- /// 数据接收
- /// </summary>
- 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("接收数据完成 。");
- }
- }
- }
- /// <summary>
- /// 串口打开
- /// </summary>
- 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);
- }
- }
- /// <summary>
- /// 串口关闭
- /// </summary>
- public void Close()
- {
- StopReading();
- serialPort.Close();
- if (serialOpen != null)
- {
- serialOpen(IsOpen);
- }
- }
- /// <summary>
- /// 串口写入数据
- /// </summary>
- /// <param name="send"></param>
- /// <param name="offSet"></param>
- /// <param name="count"></param>
- public void WritePort(byte[] send, int offSet, int count)
- {
- if (IsOpen)
- {
- LogHelper.log.Debug("开始写入数据。");
- serialPort.Write(send, offSet, count);
- }
- }
- }
- /// <summary>
- /// 串口接收数据
- /// </summary>
- public delegate void EventSerialDataReceiveHandler(SerialPortDataReceiveEventArgs e);
- public class SerialPortDataReceiveEventArgs : EventArgs
- {
- public string Value { get; set; }
- public SerialPortDataReceiveEventArgs(string value)
- {
- this.Value = value;
- }
- }
- }
|