gpt4 book ai didi

c# - C#中issue/response串口处理

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:41 25 4
gpt4 key购买 nike

好的,这就是问题所在(这与我之前的一篇文章有​​关)

我需要能够为串行通信建立一个问题/响应系统,其工作方式如下:

问题:你好回复:世界?问题:不,你好护士回复:嗯,你一点都不好玩。

这意味着我说“你好”远程单元应该发回“世界?”在某个时间范围内,如果没有,我应该有办法访问该缓冲区,所以这就是我的想法,请给我反馈

一个 ReaderWriterLock'd 'readBuffer'将写入流的 Issue 方法一个响应方法,它将监视 readBuffer,直到它包含我期望的内容或直到超时到期。

首先,stackoverflow 社区将如何设计此类,其次,他们将如何编写 datarecieved 事件?第三,他们如何使此代码更健壮,以便该类的多个实例可以存在于并行线程中以进行同时通信?

最佳答案

这基本上是一个 producer-consumer问题,所以这应该是总体设计的基础。

这里有一些想法:

a) FIFO 缓冲区(队列)

首先,您的类的每个实例都应该有一个线程安全队列(一个 FIFO 缓冲区)的实例。一个线程将接收数据并填充它,而另一个线程将以线程安全的方式读取数据。这仅意味着您必须对每个入队/出队操作使用锁。

FIFO 队列使您能够在工作线程中同时处理数据,同时从通信线程填充数据。如果您需要接收大量数据,您可以在工作线程中出列一些数据,并在接收到所有数据之前对其进行解析。否则,您将需要等到所有数据都已收到后才能一次全部解析。在大多数情况下,在开始解析数据之前,您不知道应该获取多少数据。

b) 工作线程等待数据

我会创建一个工作线程,它会等待收到新数据的信号。您可以使用 ManualResetEvent.WaitOne(timeOut) 设置超时,以防一段时间内没有任何反应。收到数据后,您必须根据当前状态对其进行解析——因此这将是 state machine 的实现。 .

c) 端口抽象

要处理不同类型的端口,您可以将串行端口包装在一个接口(interface)中,该接口(interface)至少可以具有这些方法(我可能忘记了什么):

 interface IPort
{
void Open();
void Close();
event EventHandler<DataEventArgs> DataReceived;
void Write(Data data);
}

这将帮助您将特定的通信代码与状态机分开。

注意:(根据 Microsoft 的说法)DataReceived 事件不能保证在接收到的每个字节时都会引发。使用 BytesToRead 属性确定缓冲区中剩余的数据量。因此,您可以创建自己的 IPort 实现,它会定期轮询 SerialPort 以确保您不会错过任何一个字节(SO 的问题已经解决了这个问题)。

d) 接收数据

要接收数据,您必须为 IPort.DataReceived 事件(或 SerialPort.DataReceived,如果您没有包装它)附加一个处理程序,并将接收到的数据排队到处理程序中的队列中。在该处理程序中,您还可以设置 mentionel ManualResetEvent 以通知工作线程已收到新数据。

关于c# - C#中issue/response串口处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/678113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com