C#串口通信帮助类
C#串口通信帮助类
最近开发涉及到和下位机程序进行通信,采用RS485模式,之前也做过类似的开发,本次将封装的通信类进行公开,方便后续类似问题进行快速解决处理。
using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Common { public class SerialPortHelper:IDisposable { /// <summary> /// 串口实例 /// </summary> private SerialPort serialPort; /// <summary> /// 默认数据编码格式 /// </summary> private Encoding defaultEncoding = Encoding.UTF8; /// <summary> /// 串口数据返回 /// </summary> public Action<byte[]> DataRecived; /// <summary> /// 初始化串口实例 /// </summary> /// <param name="port">串口号</param> /// <param name="baudrate">波特率</param> /// <param name="parity">校验位</param> /// <param name="stopBits">停止位</param> /// <param name="dataBit">数据位</param> public SerialPortHelper(int port,int baudrate=115200, Parity parity= Parity.None, StopBits stopBits= StopBits.One,int dataBit=8) { serialPort = new SerialPort(); serialPort.PortName = "COM"+port;//串口名给了串口类 serialPort.BaudRate = baudrate; // 波特率 serialPort.Parity = parity; //校验位 //停止位 serialPort.StopBits = stopBits; serialPort.DataBits = dataBit;//数据位 serialPort.DataReceived += SerialPort_DataReceived; } private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { Thread.Sleep(100); if (serialPort.BytesToRead > 0) { byte[] a = new byte[serialPort.BytesToRead];//读出缓冲区串口通信的字节 int readbytes = 0; while (serialPort.Read(a, readbytes, serialPort.BytesToRead - readbytes) <= 0) ; string str = defaultEncoding.GetString(a); Console.WriteLine("default 接收到的数据:"+str); Console.WriteLine($"{serialPort.PortName}接收数据:" + ByteHelper.ByteArrayToHexString(a)); DataRecived?.Invoke(a); } } /// <summary> /// 打开串口 /// </summary> /// <param name="encoding">数据编码</param> public void Open(Encoding encoding=null) { try { if (null!=encoding) { defaultEncoding = encoding; } serialPort.Encoding = defaultEncoding;//串口通信的编码格式 if (!serialPort.IsOpen) { serialPort.Open(); } else { throw new Exception($"串口{serialPort.PortName}已经打开,请勿重复打开!"); } } catch (Exception ex) { throw new Exception($"打开串口{serialPort.PortName}失败,如果已经开启,请先关闭!"+ex.Message); } } /// <summary> /// 关闭串口 /// </summary> public void Close() { if (serialPort.IsOpen) { serialPort.DataReceived -= SerialPort_DataReceived; serialPort.DiscardInBuffer(); serialPort.Dispose(); serialPort.Close(); } } /// <summary> /// 发送数据 /// </summary> /// <param name="data"></param> public void Send(byte[] data) { Console.WriteLine($"{serialPort.PortName}发送数据:"+ByteHelper.ByteArrayToHexString(data)); serialPort.Write(data,0,data.Length);//将数据写入串行端口输出缓冲区 } public void Dispose() { this.Close(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示