gpt4 book ai didi

.net - 如何组织与串行端口设备通信的代码?

转载 作者:行者123 更新时间:2023-12-01 06:37:06 27 4
gpt4 key购买 nike

我正在编写一个需要与串行端口设备通信的 .Net 应用程序。该设备基本上是一些老式字母数字寻呼机的发射器。有时,我的应用程序需要打开一个串行端口并向发射器发送一条消息。

我知道与设备交谈的协议(protocol)。这是一个来回“健谈”的协议(protocol)。发送命令...等待特定响应...发送另一个命令...等待另一个特定响应...发送实际消息...等待“接受”响应。我可以让它与一些真正的 hacky 代码一起工作,这些代码涉及对 SerialPort 对象的一系列 Write(...) 方法调用,中间有 Thread.Sleep 调用。

当然,我不想真正做到这一点,依靠 Thread.Sleep 等待设备响应。似乎 Reactive Extensions 框架应该适合这种类型的东西,但我很难理解它。我从这个开始,但很快就迷路了,不知道下一步该去哪里,或者这是否有意义:

var receivedData = Observable.FromEventPattern<SerialDataReceivedEventArgs>(serialPort, "DataReceived");
receivedData
.Where(d => d.EventArgs.EventType == SerialData.Chars)
.Subscribe(args =>
{
var response = serialPort.ReadExisting();
// Now what?
});

首先,我如何通过第一个 serialPort.Write() 调用来解决这个问题?那么我如何通过在发出下一个 Write() 调用之前检查预期的响应来将它们链接在一起呢?当然,如果我没有得到预期的响应,我会想爆发并抛出异常或其他东西。我什至会用 Rx 找到正确的树,还是有另一种更适合这个的模式?谢谢!

最佳答案

Rx 是对“数据源推送数据”场景的抽象。在您的情况下,您已将串行端口“读取”方法建模为 Rx observable,这需要与串行端口写入方法结合使用。一种可能的解决方案如下所示,尽管它可能需要根据您的应用程序的特定需求进行一些其他修改。

            var serialPort = new System.IO.Ports.SerialPort("COM1");
serialPort.Open();
var receivedData = Observable.FromEvent<SerialDataReceivedEventArgs>(serialPort, "DataReceived")
.Where(d => d.EventArgs.EventType == SerialData.Chars)
.Select(_ => serialPort.ReadExisting());
var replay = new ReplaySubject<string>();
receivedData.Subscribe(replay);
var commands = (new List<string>() { "Init", "Hello", "Done" });
commands.Select((s, i) =>
{
serialPort.Write(s);
var read = replay.Skip(i).First();
//Validate s command against read response
return true;//To some value to indicate success or failure
}).ToList();

关于.net - 如何组织与串行端口设备通信的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7342530/

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