【问题标题】:confused when receiving data from serial port从串口接收数据时感到困惑
【发布时间】:2012-02-16 11:27:38
【问题描述】:

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

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

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

只有具有相同地址的机器才能应答(主从架构)。

响应消息的格式为:[STX] (Temp) <DATA> [ETX]. 该字段仅包含温度值 stx 开始文本。 etx 结束文本。

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

所以简单的情况是:
-我将数据发送到烤箱。
- 我收到了数据。
- 我无法决定哪个烤箱回答了。
请任何人有一个想法。 PS:我使用的协议是:欧陆的EI-BISYNCH EuroTherm

如果需要:EI-Bisynch ASCII Sequence Diagrams

【问题讨论】:

  • 嗯,您知道您将请求发送给了谁,因此如果在响应中未确定发件人,似乎唯一的做法是在发送新请求之前等待响应。
  • @500 - 内部服务器错误:这里的问题是我从一个循环发送给每个人。有些机器可能处于离线或关闭状态,因此无法响应
  • SerialPort.PortName 匹配机器。
  • 多少个烤箱?不是每个烤箱都连接到它自己的串口:COM1-->烤箱_1,COM2-->烤箱_2等......在这种情况下,汉斯的回答是正确的。事实上,如果这是使用 COM 端口的真正 RS-232 串行 COM,那么它必须是这种方式。只有其他可能性是 RS-485,您会知道,因为您必须在数据包中放入设备地址?

标签: c# wpf serial-port


【解决方案1】:

在这些情况下,典型的解决方案是:

  1. 向当前设备发送请求
  2. 等待定义超时的答案
    • 如果我们在超时时间内收到答复,设备就会响应。
    • 如果我们没有收到回复,则设备处于离线状态,请将其标记为离线。
  3. 切换到下一个设备,转到 1

基本上,您应该能够将此处描述的代码包装到一个循环中: Providing Asynchronous Serial Port Communication

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

【讨论】:

  • 好吧,谢谢大家支持我
    我解决了这个问题:)
【解决方案2】:

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

  • 主人 -> 嘿 #1 告诉我你的温度 -> #1 先生!是的先生! 23 度!
  • 大师 -> 嘿#2...

这个想法是没有其他奴隶会回应。按照协议约定。

除了这种串行的系统之外,它很难做任何事情。

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

【讨论】:

  • +1:请注意,如果 OP 使用的是 MODBUS RTU 版本,则所有从站响应应包括从站地址、数据和校验和值。
  • @Keith Nicholas:您能否提供更多解释或代码。因为我不是真正的 mvvm 专家。@ Chris Lively:不,我们使用 ELbisynch
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2013-05-09
    • 2021-11-28
    • 2012-07-18
    相关资源
    最近更新 更多