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 SIASUN.Autopilot.GNSS
{
public class SerialPortBase
{
public event EventSerialDataReceiveHandler serialDataReceived;
private SerialPort serialPort;
private Thread thread;
volatile bool _keepReading;
///
/// 串口通信
///
/// 端口号
/// 波特率
/// 数据位
public SerialPortBase(string PortNumber, int baudRate, int DataBits)
{
serialPort = new SerialPort();
thread = null;
_keepReading = false;
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;
Open();
}
// 串口是否打开
public bool IsOpen
{
get
{
return serialPort.IsOpen;
}
}
///
/// 开始接收数据
///
private void StartReading()
{
if (!_keepReading)
{
_keepReading = true;
thread = new Thread(new ThreadStart(ReadPort));
thread.Start();
}
}
///
/// 停止读取数据
///
public void StopReading()
{
if (_keepReading)
{
_keepReading = false;
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;
}
//Thread.Sleep(10);
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
{
Close();
serialPort.Open();
if (serialPort.IsOpen)
{
StartReading();
}
else
{
LogHelper.log.Error("串口打开失败。");
}
}
catch (Exception ex)
{
LogHelper.log.Error("打开串口时出现错误,错误为", ex);
return;
}
}
///
/// 串口关闭
///
public void Close()
{
StopReading();
serialPort.Close();
}
///
/// 串口写入数据
///
///
///
///
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;
}
}
}