gpt4 book ai didi

c# - 如何使用 Rx 从 SerialPort 读取数据的 "reconstruct lines"

转载 作者:太空狗 更新时间:2023-10-29 23:14:48 25 4
gpt4 key购买 nike

我刚开始学习 Rx,并尝试使用 SerialPort 从 GPS 设备实现“NMEA 句子阅读器”。事实上,它的 GPS 数据对这个问题来说不太重要,所以让我们澄清一下 NMEA 格式由线条组成,“$”符号代表新条目的开始,所以你得到的“句子”看起来类似于:

$[data for first line goes here]
$[data for second line goes here]
...

连接 SerialPort 的 DataReceived 事件非常简单:

 var port = new SerialPort("COM3", 4800);

var serialPortSource = Observable.FromEventPattern<
SerialDataReceivedEventHandler,
SerialDataReceivedEventArgs>
(
handler => port.DataReceived += handler,
handler => port.DataReceived -= handler
).Select(e => port.ReadExisting());

这给出了一个 IObservable<string> , 但显然这里返回的字符串不一定与 NMEA 句子对齐。例如,对于上面的示例数据,可以得到这样的序列:

$[data for first line g
oes here]\r\n$[data for
second line goes here]

如何正确地将其转换为一系列实际句子?在IEnumerable世界,我可能会从 char 的序列开始s 并写一个类似这样的扩展方法:

public static IEnumerable<string> ToNmeaSentence(
this IEnumerable<char> characters
)
{
var sb = new StringBuilder();
foreach (var ch in characters)
{
if (ch == '$' && sb.Length > 0)
{
yield return sb.ToString();
sb.Clear();
}
sb.Append(ch);
}
}

现在我想知道在 Rx 中是否有一种惯用的方式来进行这种操作?

最佳答案

它与 Enumerables 的代码完全相同。您使用 Subscribe 而不是快速枚举,并且您使用 observer.OnNext 而不是 yield return。哦,你必须使用 Observable.Create,因为 C# 没有像它对 Enumerables 那样对观察者的语言支持(但是。这不是 Rx 的失败)。

Enumerables 和 Observables 是一回事。一个推,另一个拉。创建它们的语法略有不同。就这样。

public static IObservable<string> ToNmeaSentence(
this IObservable<char> characters
)
{
return Observable.Create<string>(observer => {

var sb = new StringBuilder();

return characters.Subscribe(ch => {

if (ch == '$' && sb.Length > 0)
{
observer.OnNext(sb.ToString());
sb.Clear();
}
sb.Append(ch);

});

});
}

我通常不会在这么低的水平上编程,但是 Observables 并不比 Enumerables 更使它复杂化。当人们第一次学习 Enumerables 时,很难理解。人们刚开始学习 Observables 时,很难理解。他们两个做同样的事情,但是一推一拉。除了这一区别外,两者之间存在 1-1 的关系。

如果您认为 Rx 比 Enumerables 和 LINQ to Objects 更复杂,那您就错了。当您仍在学习时,它只是以这种方式出现。

关于c# - 如何使用 Rx 从 SerialPort 读取数据的 "reconstruct lines",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23784429/

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