using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CNAS_SerialPort { public class SerialPortHelper { /// /// 串口助手通用类 /// #region 相关属性 /// /// 创建一个串口操作对象 /// private SerialPort serialPort = null; public SerialPort SerialPortObject { get { return serialPort; } } /// /// 获取当前计算机上可用的端口列表【只读】 /// public string[] PortNames { get { return System.IO.Ports.SerialPort.GetPortNames(); } } /// /// 进制转换对象属性 /// private AlgorithmHelper algorithmHelper = null; public AlgorithmHelper AlgorithmHelperObject { get { return algorithmHelper; } } /// /// 构造方法中初始化相关数据 /// public SerialPortHelper() { this.serialPort = new SerialPort(); this.algorithmHelper = new AlgorithmHelper(); //串口基本参数初始化 this.serialPort.BaudRate = 9600; this.serialPort.Parity = System.IO.Ports.Parity.None;//校验位默认NONE this.serialPort.DataBits = 8;//数据位默认8位 this.serialPort.StopBits = System.IO.Ports.StopBits.One;//停止位默认1位 } #endregion #region 打开或关闭端口 /// /// 根据端口名称打开端口或关闭端口 /// /// 端口名称 /// 操作状态:1表示打开,0表示关闭 /// 返回当前端口的打开状态true或false public bool OpenSerialPort(string portName, int status) { if (status == 1) { this.serialPort.PortName = portName;//只有在端口没有打开的时候,才能设置名称。 this.serialPort.Open(); } else { this.serialPort.Close(); } return this.serialPort.IsOpen;//返回串口打开的状态 } #endregion #region 发送数据 /// /// 判断十六进制字符串hex是否正确 /// /// 十六进制字符串 /// true:正确,false:不正确 private bool IsIIlegalHex(string hex) { return System.Text.RegularExpressions.Regex.IsMatch(hex, @"([^A-Fa-f0-9]|\s+?)+"); } /// /// 发送数据(可以是16进制,也可以是字符串) /// /// 要发送的数据 /// 发送的数据格式 public void SendData(string data, SendFormat format) { if (!this.serialPort.IsOpen) { throw new Exception("端口未打开!请打开相关端口!");//让调用者处理 } else { byte[] byteData; if (format == SendFormat.Hex)//如果是16进制 { if (this.IsIIlegalHex(data)) { byteData = algorithmHelper.From16ToBtyes(data);//将16进制转换成byte[]数组 } else { throw new Exception("数据不是16进制格式!"); } } else //发送字符串 { byteData = algorithmHelper.StringToBytes(data, false); } this.serialPort.Write(byteData, 0, byteData.Length);//发送数据(数据,从0开始,结束位置) } } #endregion #region 接收数据 /// /// 串口接收数据 /// /// public byte[] ReceiveData() { //定义一个接收数组,获取接收缓冲区数据的字节数 byte[] byteData = new byte[this.serialPort.BytesToRead]; //读取数据 this.serialPort.Read(byteData, 0, serialPort.BytesToRead); return byteData; } #endregion } #region 发送格式选择枚举 /// /// 发送格式选择 /// public enum SendFormat { Hex,//十六进制 String } #endregion }