DockTool/serialPortOption.cs
2024-12-12 14:09:48 +08:00

156 lines
5.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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