110,533
社区成员
发帖
与我相关
我的任务
分享
public class ComHelper
{
/// <summary>初始化串行端口</summary>
private SerialPort serialPort;
public delegate void SerialPortDataReceivedDelegate(object sender, SerialDataReceivedEventArgs e);
#region 函数
/// <summary>
/// COM口通信构造函数
/// </summary>
/// <param name="PortID">通信端口</param>
/// <param name="baudRate">波特率</param>
/// <param name="parity">奇偶校验位</param>
/// <param name="dataBits">标准数据位长度</param>
/// <param name="stopBits">每个字节的标准停止位数</param>
/// <param name="readTimeout">获取或设置读取操作未完成时发生超时之前的毫秒数</param>
/// <param name="writeTimeout">获取或设置写入操作未完成时发生超时之前的毫秒数</param>
public ComHelper(int PortID, int baudRate, Parity parity = Parity.None, int dataBits = 8, StopBits stopBits = StopBits.One, int readTimeout = 100, int writeTimeout = 100)
{
try
{
serialPort = new SerialPort();
serialPort.PortName = "COM" + PortID;//通信端口
serialPort.BaudRate = baudRate;//波特率
serialPort.Encoding = Encoding.ASCII;
serialPort.Parity = parity;//奇偶校验位
serialPort.DataBits = dataBits;//标准数据位长度
serialPort.StopBits = stopBits;//每个字节的标准停止位数
serialPort.ReadTimeout = readTimeout;//获取或设置读取操作未完成时发生超时之前的毫秒数
serialPort.WriteTimeout = writeTimeout;//获取或设置写入操作未完成时发生超时之前的毫秒数
serialPort.Handshake = Handshake.XOnXOff;
//serialPort.ReceivedBytesThreshold = 8; // 设置事件发生前 缓冲区中的字节数
}
catch (Exception ex) { throw new Exception(ex.Message); }
}
/// <summary>
/// 打开COM口
/// </summary>
/// <returns>true 打开成功;false 打开失败;</returns>
public void Open()
{
if (serialPort.IsOpen == false)
{
serialPort.Open();
}
}
/// <summary>
/// 关闭COM口
/// </summary>
/// <returns>true 关闭成功;false 关闭失败;</returns>
public void Close()
{
if (serialPort.IsOpen)
serialPort.Close();
}
/// <summary>
/// 判断端口是否打开
/// </summary>
/// <returns></returns>
public bool IsOpen() { return serialPort.IsOpen; }
/// <summary>
/// 向COM接口发送信息
/// </summary>
public void WriteData(string sendCommand)
{
try
{
if (IsOpen())
{
// 测试数据
byte[] sendvalue = HexStringToBinary(new List<string>() { "0x1B", "0x4A", "10" }).ToArray();
serialPort.Write(sendvalue, 0, sendvalue.Length);
}
else { throw new Exception("端口打开失败!"); }
}
catch { throw; }
finally
{
}
}
public void AddReceiveEventHanlder(SerialPortDataReceivedDelegate serialPort_DataReceived)
{
try
{
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataReceived);
}
catch { throw; }
}
/// <summary>
/// 接收来自COM的信息
/// </summary>
/// <returns>返回收到信息的数组</returns>
public List<string> ReceiveDataList()
{
try
{
if (!serialPort.IsOpen) return null;
int DataLength = serialPort.BytesToRead;
byte[] ds = new byte[DataLength];
int bytecount = serialPort.Read(ds, 0, DataLength);
return ByteToList(ds);
}
catch { throw; }
}
#endregion
#region 解析函数
/// <summary>
/// 将16进制字符串转换成16进制字节数组
/// </summary>
/// <param name="hexstring"></param>
/// <returns></returns>
private List<byte> HexStringToBinary(List<string> hexstring)
{
try
{
List<byte> binary = new List<byte>();
foreach (string hex in hexstring)
{
binary.Add(Convert.ToByte(hex.Trim(), 16));
}
return binary;
}
catch { throw; }
}
/// <summary>
/// 把字节型转换成十六进制字符串
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
private List<string> ByteToList(byte[] bytes)
{
try
{
List<string> list = new List<string>();
foreach (byte byt in bytes)
{
list.Add(String.Format("{0:X2} ", byt).Trim());
}
return list;
}
catch { throw; }
}
#endregion
}