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;
}
}
}