- 分享一段C#的串口通信类
- 也希望可以对更多像我一样的初学者带来更多的帮助 😃😃
using System;
using System.IO.Ports;
using System.Threading;
namespace SerialPortProgram
{
public class SerialPortOP
{
/// <summary>
/// 接收数据
/// </summary>
public byte[] recvData;
private SerialPort SerialPort;
/// <summary>
/// 初始化配置并打开串口
/// </summary>
/// <param name="comName">串口名称</param>
/// <param name="baud">波特率</param>
/// <param name="dataBits">数据位</param>
/// <param name="parity">校验位</param>
/// <returns>成功:SerialPort 实例,否则:null</returns>
public SerialPort InitSerialPort(string comName, int baud, int dataBits = 8, Parity parity = Parity.None)
{
try
{
if (SerialPort is null || !SerialPort.IsOpen)
{
SerialPort = new SerialPort
{
PortName = comName, // 串口名称
BaudRate = baud, // 波特率
DataBits = dataBits, // 数据位
Parity = parity, // 校验位
};
SerialPort.Open(); // 打开串口
SerialPort.DtrEnable = true;
SerialPort.RtsEnable = true;
SerialPort.DataReceived += SerialPort_DataReceived;
SerialPort.ErrorReceived += SerialPort_ErrorReceived;
return SerialPort;
}
return default;
}
catch (Exception ex)
{
return default;
}
}
/// <summary>
/// 错误处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
Console.WriteLine($"发生错误");
}
/// <summary>
/// 接收数据处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
SerialPort _SerialPort = sender as SerialPort;
recvData = new byte[_SerialPort.BytesToRead];
_SerialPort.Read(recvData, 0, recvData.Length);
}
/// <summary>
/// 写入byte数据
/// </summary>
/// <param name="data">数据</param>
/// <returns></returns>
public bool SendData(byte[] data)
{
if (SerialPort != null && SerialPort.IsOpen)
{
SerialPort.Write(data, 0, data.Length);
return true;
}
else
{
return false;
}
}
/// <summary>
/// 关闭串口
/// </summary>
public void ClosePort()
{
if (SerialPort != null && SerialPort.IsOpen)
{
SerialPort.DiscardInBuffer();
SerialPort.DiscardOutBuffer();
SerialPort.Close();
}
}
/// <summary>
/// 字符串转byte
/// </summary>
/// <param name="str">可读指令</param>
/// <returns>byte[]</returns>
public byte[] StringToHexByteArray(string instruction)
{
byte[] bytes = System.Text.Encoding.Default.GetBytes(instruction);
string[] hexString = BitConverter.ToString(bytes, 0, bytes.Length).Split('-');
int len = hexString.Length;
byte[] returnBytes = new byte[len];
for (int i = 0; i < len; i++)
{
returnBytes[i] = Convert.ToByte(hexString[i], 16);
}
return returnBytes;
}
}
}
作为笔记记录下,需要可直接拿去使用,也请多多指教