0
点赞
收藏
分享

微信扫一扫

C#串口通信类


  • 分享一段C#的串口通信类
  • 也希望可以对更多像我一样的初学者带来更多的帮助 😃😃

using System;
using System.IO.Ports;
using System.Threading;

namespace SerialPortProgram
{
public class SerialPortOP
{
SerialPort mSerialPort;
bool ReceiveEventFlag = false;
public SerialPortOP() { }

public delegate void SerialPortEventArgs(object sender, SerialDataReceivedEventArgs e, byte[] bits);

public event SerialPortEventArgs DataReceived;

/// <summary>
/// SerialPortOP
/// </summary>
/// <param name="mcomPortName">端口号</param>
/// <param name="baudRate">波特率</param>
/// <param name="parity">校验位</param>
/// <param name="mdataBits">数据长度</param>
/// <param name="mstopBits">停止位</param>
public SerialPortOP(string mcomPortName, int baudRate, Parity parity, int mdataBits, StopBits mstopBits)
{
mSerialPort = new SerialPort(mcomPortName, baudRate, Parity.None, mdataBits, mstopBits);
//读取数据超时时间
mSerialPort.ReadTimeout = 3000;
//自动接收
mSerialPort.RtsEnable = true;
setSerialPort();
}

~SerialPortOP()
{
if (mSerialPort.IsOpen)
{
mSerialPort.Close();
}
}

/// <summary>
/// 设置数据的接收
/// </summary>
private void setSerialPort()
{
if (mSerialPort != null)
{
mSerialPort.ReceivedBytesThreshold = 1;// 接收到一个字节,出发数据接收事件
mSerialPort.DataReceived += MSerialPort_DataReceived;
mSerialPort.ErrorReceived += MSerialPort_ErrorReceived;
OpenPort();
}
}

/// <summary>
/// 打开串口
/// </summary>
/// <returns></returns>
private bool OpenPort()
{
bool flag = false;
ColsePort();
if (mSerialPort != null)
{
try
{
mSerialPort.Open();
flag = true;
}
catch (Exception)
{
throw;
}
}
return flag;
}

/// <summary>
/// 关闭串口
/// </summary>
public void ColsePort()
{
if (mSerialPort.IsOpen)
mSerialPort.Close();
}

/// <summary>
/// 数据接受的错误处理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MSerialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{

}

/// <summary>
/// 通过异步方式数据接收-委托事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MSerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (ReceiveEventFlag == true)
{
return;
}
try
{
Thread.Sleep(20);
byte[] _data = new byte[mSerialPort.BytesToRead];
mSerialPort.Read(_data, 0, _data.Length);
if (_data.Length == 0)
{
return;
}

if (DataReceived != null)
{
DataReceived(sender, e, _data);
mSerialPort.DiscardInBuffer();
}
}
catch (Exception)
{
throw;
}
}

/// <summary>
/// 发送字节数据
/// </summary>
/// <param name="data"></param>
/// <param name="offset"></param>
/// <param name="count"></param>
public void SendData(byte[] data, int offset, int count)
{
try
{
if (ReceiveEventFlag == true)
{
return;
}
if (mSerialPort.IsOpen)
{
mSerialPort.DiscardInBuffer();
mSerialPort.Write(data, offset, count);
}
}
catch (Exception)
{

throw;
}
}

/// <summary>
/// 发送string数据
/// </summary>
/// <param name="strData"></param>
public void SendData(string strData)
{
try
{
if (ReceiveEventFlag == true)
{
return;
}
if (mSerialPort.IsOpen)
{
mSerialPort.DiscardInBuffer();
mSerialPort.Write(strData);
}
}
catch (Exception)
{
throw;
}
}

/// <summary>
/// 获取串口名称列表
/// </summary>
/// <returns></returns>
public string[] GetPortNames()
{
return SerialPort.GetPortNames();
}
}
}

作为笔记记录下,需要可直接拿去使用,也请多多指教


举报

相关推荐

0 条评论