从串口接收数据时很困惑

时间:2012-02-14 20:53:42

标签: c# wpf serial-port

我遇到一个问题,花了我太多时间,但没有解决它。所以我真的希望你帮助我。

我有一个用c#wpf构建的应用程序,并通过串口与烤箱通信。

我需要发送的帧格式如下:[EOT] (GID) (UID) (Temp) [ENQ] gid uid:组标识符和单元标识符(机器的地址)。 (eof),(enq):构成消息的框架。 (temp)表示:给我温度值。

唯一具有相同地址的计算机可以应答(主从架构)。

回复邮件的格式为:[STX] (Temp) <DATA> [ETX]. 该字段仅包含温度值 stx开始文本。 etx end text。

我发送和接收数据没有问题,我可以显示连接的单台机器的温度值。 但是当我连接更多的机器时,我不知道哪台机器已经回答了我发送的帧,因为响应帧没有任何地址,所以我可以确定哪个烤箱有响应。

所以简要的情况是:
  - 我向烤箱发送数据   - 我收到了数据   - 我无法决定回答哪个烤箱 请任何人有个主意。 PS:我使用协议:eurotherm EuroTherm

的EI-BISYNCH

如果需要:EI-Bisynch ASCII Sequence Diagrams

3 个答案:

答案 0 :(得分:1)

在这些情况下,您所处理的机器正在响应(或至少它被假定为)单主机 - 多从机。含义: -

  • 主人 - &gt;嘿#1告诉我你的温度 - &gt; #1 SIR!是的先生! 23度!
  • 主人 - &gt;嘿#2 ......

这个想法是没有其他奴隶会回应。按照议定书的惯例。

除了这种串行系统外,很难做任何其他事情。

在设计方面,如果您创建类似命令队列的东西。每个命令都知道它想要与之通信的设备,以及它想要问的问题。您处理每个命令,发送串行消息,获取响应,并将其返回给命令。现在你有一个命令,它知道它与哪个设备通信,以及该设备的响应是什么。

答案 1 :(得分:1)

在这些条件下,典型的解决方案是:

  1. 将请求发送到当前设备
  2. 等待定义超时的答案
    • 如果我们在超时时间内收到答案,设备会回复。
    • 如果我们没有收到答案,设备会离线,请将其标记为。
  3. 切换到下一个设备,转到1
  4. 基本上你应该能够将这里描述的代码包装成循环: Providing Asynchronous Serial Port Communication

    这是一个与AutoResetEvent一起使用的示例。一个.Net多线程,允许同步线程(在循环中发送请求的线程,以及在循环中接收消息的线程)

答案 2 :(得分:0)

只要您只有一个“飞行中”命令等待响应,并且您知道将命令发送到哪个设备,您可以认为接下来响应的设备是您询问的设备回复。现在,如果您的设备可能发送未提示的响应,则不一定总是如此。