using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.IO;
using Haier_Common;
using System.Linq;
namespace Control
{
public static class SerialHelper
{
public static SerialPort _serialPort = new SerialPort();
public static void initialize()//初始化
{
//关闭串口时回抛异常
try
{
string[] ports = SerialPort.GetPortNames();//获取当前计算机的串行端口名的数组。
_serialPort.PortName = Global.PortName;//ports[0].ToString();//串口号//
_serialPort.BaudRate = Convert.ToInt32(115200);//波特率
_serialPort.DataBits = 8;//数据位
_serialPort.StopBits = StopBits.One;//停止位
_serialPort.Parity = Parity.None;//校验位
_serialPort.WriteBufferSize = 2048;
pubfunction.WriteLogWorkDate("小屏幕", Global.PortName);
}
catch (Exception ex)
{
pubfunction.WriteLogWorkDate("串口报错", ex.Message);
}
}
public static void SerialOpen()//串口开
{
try
{
_serialPort.Open();
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);//添加数据接收事件
}
catch (Exception ex)
{
pubfunction.WriteLogWorkDate("串口报错", ex.Message);
}
}
public static void SerialClose()//串口关
{
try
{
_serialPort.DataReceived -= DataReceivedHandler;
_serialPort.Close();
}
catch (Exception ex)
{
pubfunction.WriteLogWorkDate("串口报错", ex.Message);
}
}
public static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)//读取下位机的数据
{
try
{
Thread.Sleep(200);
int len = _serialPort.BytesToRead;
byte[] buffer = new byte[len];
_serialPort.Read(buffer, 0, len);
string strData = BitConverter.ToString(buffer, 0, len);
pubfunction.WriteLogWorkDate("小屏幕", "接收:" + strData);
}
catch (Exception ex)
{
pubfunction.WriteLogWorkDate("串口报错", ex.Message);
Global.ShowMessge(ex.Message);
}
}
public static void SerialSend(string SendData)//发送按钮
{
try
{
//string a = SendData.Trim();
SendData = SendData.Replace(" ", "");
byte[] Data = new byte[SendData.Length / 2];
for (int i = 0; i < SendData.Length / 2; i++)
{
//每次取两位字符组成一个16进制
Data[i] = Convert.ToByte(SendData.Substring(i * 2, 2), 16);
}
_serialPort.Write(Data, 0, Data.Length);
}
catch (Exception ex)
{
pubfunction.WriteLogWorkDate("串口报错", ex.Message);
//Global.ShowMessge(ex.Message);
}
}
public static void SerialStopSend()//停止接收数据
{
try
{
byte[] data = { 0x99 };
_serialPort.DataReceived -= DataReceivedHandler;
_serialPort.Write(data, 0, data.Length);
}
catch (Exception ex)
{
pubfunction.WriteLogWorkDate("串口报错", ex.Message);
Global.ShowMessge(ex.Message);
}
}
private static void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
_serialPort.Close();
}
/// <summary>
/// 向串口发送数据,读取返回数据
/// </summary>
/// <param name="sendData">发送的数据</param>
/// <returns>返回的数据</returns>
public string ReadPort(string sendData)
{
//string a = SendData.Trim();
sendData = sendData.Replace(" ", "");
byte[] Data = new byte[sendData.Length / 2];
for (int i = 0; i < sendData.Length / 2; i++)
{
//每次取两位字符组成一个16进制
Data[i] = Convert.ToByte(sendData.Substring(i * 2, 2), 16);
}
WriteLogWorkDate("串口" + _serialPort.PortName, "发送:" + sendData);
//_serialPort.Write(Data, 0, Data.Length);
//打开连接
//if (!_serialPort.IsOpen) _serialPort.Open();
//发送数据
_serialPort.DiscardInBuffer();
_serialPort.Write(Data, 0, Data.Length);
//读取返回数据
DateTime dt = DateTime.Now;
while (_serialPort.BytesToRead < 2)
{
Thread.Sleep(1);
if (DateTime.Now.Subtract(dt).TotalMilliseconds > 5000) //如果5秒后仍然无数据返回,则视为超时
{
return "";
}
}
string strData = "";
A:
Thread.Sleep(10);
int len = _serialPort.BytesToRead;
byte[] buffer = new byte[len];
_serialPort.Read(buffer, 0, len);
strData += BitConverter.ToString(buffer, 0, len);
if (_serialPort.BytesToRead != 0)
{
Thread.Sleep(10);
goto A;
}
WriteLogWorkDate("串口" + _serialPort.PortName, "接收:" + strData);
_serialPort.DiscardInBuffer();
return strData;
}
}
}
C# 串口操作类SerialHelper
于 2022-03-21 10:52:22 首次发布