2024年5月11日发(作者:)

ceived之“管收不管埋”

通过把SerialPort进行封装,以多线程和缓存的方式处理串口的发送和接收动作。

一、现象

不管如何设置ReceivedBytesThreshold的值,DataReceived接收到的数据都是比

较混乱,不是一个完整的应答数据。

二、原因

1、上位机下发的命令比较密集,以200ms周期发送实时状态轮询命令。

2、在状态实时轮询命令中间有操作命令插入。

2、不同的命令,接收的应答格式也不同。

三、分析

不同的命令有不同的应答数据,但是不同的应答数据中都具有唯一的结束符,可以根据

结束符来作为多个应答数据的分割标志。因此可以把应答数据进行缓存,然后另起一个线程

对缓存的应答数据进行分析处理。

因此系统具有:

1、命令队列用来插入操作命令,空闲时处理状态实时轮询命令。

2、命令发送线程,以200ms周期性的发送队列中的命令。

3、应答集合,用来缓存DataReceived接收数据。

4、应答处理线程,对应答集合中的数据进行集中处理。

四、代码片段

1、定义

///

/// 请求命令队列 /// private

Queue requests;

///

/// 应答数据集合 /// private

List responses;

///

/// 发送线程同步信号 /// private

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、开始、停止线程

///

/// 启动服务 /// public void

Start()

{

try

{

if (!)

{

();

}

();

//插入初始化命令 (new Request());

();

();

}

catch (Exception ex)

{

throw ex;

}

}

///

/// 停止服务 /// public void

Stop()

{

();

();

if ()

{

();

}

();

();

}