基于串口通信的仪器控制应用的体系结构建议

时间:2014-04-24 19:14:59

标签: architecture serial-port async-await .net-4.5 tpl-dataflow

我刚刚启动了一个项目来控制通过RS-232串口通信的工业仪器。波特率限制在9600 ......相当慢。

该仪器可以两种模式运行 - 轮询,PC发送请求,仪器回复数据;或连续的,仪器发送恒定的流数据。数据需要从ASCII转换为浮点数并绘制。

我对使用SerialPort DataRecieved事件的示例程序进行的初步实验并不吉利......在使用仪器连续传输的情况下,很容易让用户界面变得无响应。

我已经查看过产生单独任务的其他示例项目等,但它们看起来都很复杂,我想知道是否有更好的方法,尤其是最新.NET的功能运行时(我写这篇文章时为4.5.1)。

像Async API这样的东西,Dataflow对于这种类型的应用程序看起来特别有前途。我已经开始尝试使用Async API接收数据。代码非常简单,但是在使其变得健壮(异常处理)方面存在一些问题。

最简单的方法似乎是使用异步方法将数据解析为某种线程安全队列,这会将事件引发到UI以进行绘图。但我仍在研究细节。

寻找有关解决此问题的最佳方法的建议。

1 个答案:

答案 0 :(得分:1)

由于您没有太多的处理要做,我建议使用基于TPL-Dataflow构建的Rx(Reactive)框架。 Rx在处理数据流方面为您提供了更大的灵活性(将其视为事件流的Linq),而DataFlow更适合于设置数据管道,您希望对并发性进行精细控制。

最近遇到类似的问题,连接GPS阅读器,我会建议以下架构......

  • 设置独立线程以与仪器连接。
  • 您可以通过此线程的事件处理程序公开新的读数。
  • 然后,您可以使用Observable.FromEventPattern方法构建Rx Observable流
  • 此流的订阅者可以将原始数据变为他们喜欢的任何形式;事实上,如果适合他们的需要,不同的订阅者可以将其变异为完全不同的形式。
  • 由于您最终会在UI处结束,因此您需要在订阅者想要与UI进行交互时使用ObserveOnDispatcher。

有关详细信息,我强烈推荐此文档...... http://go.microsoft.com/fwlink/?LinkId=208528