2024年5月11日发(作者:)
ceived之“管收不管埋”
通过把SerialPort进行封装,以多线程和缓存的方式处理串口的发送和接收动作。
一、现象
不管如何设置ReceivedBytesThreshold的值,DataReceived接收到的数据都是比
较混乱,不是一个完整的应答数据。
二、原因
1、上位机下发的命令比较密集,以200ms周期发送实时状态轮询命令。
2、在状态实时轮询命令中间有操作命令插入。
2、不同的命令,接收的应答格式也不同。
三、分析
不同的命令有不同的应答数据,但是不同的应答数据中都具有唯一的结束符,可以根据
结束符来作为多个应答数据的分割标志。因此可以把应答数据进行缓存,然后另起一个线程
对缓存的应答数据进行分析处理。
因此系统具有:
1、命令队列用来插入操作命令,空闲时处理状态实时轮询命令。
2、命令发送线程,以200ms周期性的发送队列中的命令。
3、应答集合,用来缓存DataReceived接收数据。
4、应答处理线程,对应答集合中的数据进行集中处理。
四、代码片段
1、定义
///
Queue
///
List
///
ManualResetEvent sendWaiter;
///
private ManualResetEvent receiveWaiter;
ts = new Queue
ses = new List
iter = new ManualResetEvent(false);
eWaiter = new ManualResetEvent(false);
//命令发送线程
serWorkItem(new WaitCallback(Send));
//应答处理线程
serWorkItem(new WaitCallback(Received));
2、开始、停止线程
///
Start()
{
try
{
if (!)
{
();
}
();
//插入初始化命令 (new Request());
();
();
}
catch (Exception ex)
{
throw ex;
}
}
///
Stop()
{
();
();
if ()
{
();
}
();
();
}


发布评论