之前一直从博客园看别人的技术文章,下载别人的资源,今天终于忍不住自己写下这篇博客。为了实现稳定串口读写最近也折腾了很久,但是在网上找了很久都没有找到比较好的代码。最后去了一些外国的网站学习了别人的思想后,通过自己的理解终于写了一个测试程序,本程序经过测试发送接收大量数据均无bug出现。
首先介绍一下实现流程。
1.首先我们需要定义一个专门的串口操作类。
2.类中实现串口事件DataReceived接收数据。
3.需要后台开启一个监控线程来监控是否数据接收完成,因为串口事件是触发式,在双方没有固定协议的情况下不知道什么时候才标志接收完整的数据包。在这里思考了很久,目前本人只想到了通过时间来判定,似乎没有其他更好方法,如果在指定的时间内没有收到数据我们则认为数据接收终止。
4.定义3个事件,用来通知数据接收完成、数据发送完成、每次接收数据。
好了不多说了下面先贴上该类的源码吧
串口主要处理类
/// <summary>
/// 委托处理结果
/// </summary>
/// <param name="data"></param>
public delegate void HandResult(object sender,SerialPortEvents e);
/// <summary>
/// 委托处理接收数据完成
/// </summary>
/// <param name="data"></param>
public delegate void OnReceivedData(object sender,SerialPortEvents e);
/// <summary>
/// 发送数据回调
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void OnSendData(object sender,SerialPortEvents e);
public class SerialPortListener
{
#region 成员变量
/// <summary>
/// 定义接收缓冲区数据
/// </summary>
private List<byte> m_buffer = null;
public event HandResult SerialPortResult;
public event OnReceivedData OnSerialPortReceived;
public event OnSendData OnSeriaPortSend;
delegate void AsyncCallResult(byte[] data);
delegate void AsyncSend(byte[] data);
bool m_isReceiving = false;
/// <summary>
/// 串口对象
/// </summary>
SerialPort m_serialPort = null;
Thread m_threadMonitor = null;
/// <summary>
/// 结束符号
/// </summary>
char m_endChar = '\0';
public char EndChar
{
get { return m_endChar; }
set { m_endChar = value; }
}
/// <summary>
/// 发送缓冲区大小
/// </summary>
int m_writeBufferSize = 1024;
public int WriteBufferSize
{
get { return m_writeBufferSize; }
set { m_writeBufferSize = value;}
}
/// <summary>
/// 是否启用结束符
/// </summary>
bool m_useEndChar = true;
public bool UseEndChar
{
get { return m_useEndChar; }
set { m_useEndChar = value; }
}
/// <summary>
/// 发送间隔时间
/// </summary>
int m_sendInterval = 100;
public int SendInterval
{
get { return m_sendInterval; }
set { m_sendInterval = value; }
}
/// <summary>
/// 连续接收超时时间
/// </summary>
int m_receiveTimeout =1000;
public int ReceiveTimeout
{
get { return m_receiveTimeout; }
set { m_receiveTimeout = value; }
}
/// <summary>
/// 最后接收时间
/// </summary>
DateTime m_lastReceiveTime;
public DateTime LastReceiveTime
{
get { return m_lastReceiveTime; }
}
/// <summary>
/// 缓冲区接收大小
/// </summary>
private int m_bufferSize = 1;
public int BufferSize
{
get { return m_bufferSiz