DockTool/serialPortOption.cs

156 lines
5.3 KiB
C#
Raw Permalink Normal View History

2024-12-12 14:03:53 +08:00
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace FlyDockTool
{
public class SerialPortOption
{
/// <summary>
/// 让此类创建一个串口操作的单例类
/// </summary>
public static SerialPortOption Instance; //申明一个EcgDrawing对象复制Null
public static int BufferBytesLength = 0;
private Thread _thSerialPortDataRead; //串口数据读取线程
public SerialPort DataReadSerialPort;
public DateTime SerialTime;
private static readonly object LockHelper = new object();
public EventHandler dataOutPutShow;
public static SerialPortOption CreateInstance()
{
if (Instance == null)
lock (LockHelper)
{
if (Instance == null)
Instance = new SerialPortOption();
}
return Instance;
}
/// <summary>
/// 初始化串口
/// </summary>
public void IniserialPortOption()
{
//数据读取串口 初始化
//CcgDataReadSerialPort = new SerialPort(ConfigHelper.EcgDataComPort, 1500000, Parity.None, 8, StopBits.One)
// string CurrentDevice = ConfigurationManager.AppSettings["CurrentDevice"];//获取设备信息URL
string comName= ConfigurationManager.AppSettings[apiOptions.CurrentDevice].Split(',')[3];
int baudRate= int.Parse(ConfigurationManager.AppSettings[apiOptions.CurrentDevice].Split(',')[4]);
string parity1= ConfigurationManager.AppSettings[apiOptions.CurrentDevice].Split(',')[5];
Parity parity = Parity.None;
if (parity1.ToUpper()== "NONE")
parity= Parity.None;
if (parity1.ToUpper() == "EVEN")
parity = Parity.Even;
int databits= int.Parse(ConfigurationManager.AppSettings[apiOptions.CurrentDevice].Split(',')[6]);
StopBits SB = StopBits.One;
string sb1 = ConfigurationManager.AppSettings[apiOptions.CurrentDevice].Split(',')[7];
if (sb1== "1")
SB = StopBits.One;
if (sb1.ToUpper() == "NONE")
SB = StopBits.None;
if (sb1.ToUpper() == "2")
SB = StopBits.Two;
DataReadSerialPort = new SerialPort(comName, baudRate, parity, databits, SB)
{
RtsEnable = false,
ReadBufferSize = 4096000,
ReadTimeout = 3000,
ReceivedBytesThreshold = 1
};
SerialTime = DateTime.Now;
}
/// <summary>
/// 下发AD启动指令
/// </summary>
public void writeStartAD_Command()
{
byte[] EcgStart = { 0xBB, 0x44, 0xAA, 0x55, 0xCC, 0x01, 0x00, 0x00, 0xCB, 0x02 };
if (!DataReadSerialPort.IsOpen)
DataReadSerialPort.Open();
DataReadSerialPort.Write(EcgStart, 0, EcgStart.Length);
}
/// <summary>
/// 下发AD停止命令
/// </summary>
public void writeStopAD_Command()
{
byte[] EcgEnd = { 0xBB, 0x44, 0xAA, 0x55, 0x02, 0x00, 0x00, 0xCC, 0x02 };
if (!DataReadSerialPort.IsOpen)
{
DataReadSerialPort.Open();
}
DataReadSerialPort.Write(EcgEnd, 0, EcgEnd.Length);
}
/// <summary>
/// 终止串口数据读取的线程
/// </summary>
public void StopDataReadThread()
{
_thSerialPortDataRead.Abort();
}
/// <summary>
/// 开启串口数据读取的线程
/// </summary>
public void StartDataReadThread()
{
_thSerialPortDataRead = new Thread(DataRead)
{
IsBackground = true,
Priority = ThreadPriority.Highest
};
_thSerialPortDataRead.Start();
}
/// <summary>
/// 读取串口数据
/// </summary>
private void DataRead()
{
while (true)
{
try
{
if (!DataReadSerialPort.IsOpen)
{
DataReadSerialPort.Open();
}
BufferBytesLength = DataReadSerialPort.BytesToRead;
if (BufferBytesLength > 0)
{
var buffer = new byte[BufferBytesLength];
DataReadSerialPort.Read(buffer, 0, BufferBytesLength);
string encodingStr = "UTF-8";
try
{
encodingStr = ConfigurationManager.AppSettings[apiOptions.CurrentDevice].Split(',')[8];
}
catch { }
string ReDataStr = Encoding.GetEncoding(encodingStr).GetString(buffer);
dataOutPutShow(ReDataStr, null);
}
}
catch { }
Thread.Sleep(1000);//睡眠1秒
}
}
}
}