从串行端口接收数据时感到困惑
本文关键字:数据 串行端口 | 更新日期: 2023-09-27 18:24:41
我遇到了一个问题,花了我太多时间,但没有解决。我真的希望你能帮助我。
我有一个用c#wpf构建的应用程序,通过串行端口与烤箱通信
我需要发送的帧有以下形式:[EOT] (GID) (UID) (Temp) [ENQ]
gid-uid:组标识符和单元标识符(机器地址)。(eof),(enq):构建消息的框架。(temp)的意思是:给我温度值。
唯一具有相同地址的机器可以应答(主从架构)。
响应消息的形式为:[STX] (Temp) <DATA> [ETX].
该字段仅包含温度值stx起始文本。etx结束文本。
我在发送和接收数据方面没有问题,我可以显示连接的单个机器的温度值。但是当我连接更多的机器时,我不知道哪台机器回答了我发送的帧,因为响应帧没有任何地址,所以我可以确定哪个烤箱有响应。
因此,简而言之,情况是:
-我把数据发送到烤箱
-我收到了数据
-我不知道是哪个烤箱接的
请大家有个主意。PS:我使用协议:eurotherm eurotherm 的EI-BISYNCH
如果需要:EI Bisynch ASCII序列图
在这些条件下,典型的解决方案是:
- 将请求发送到当前设备
- 等待已定义超时的答案
- 如果我们在超时时间内收到一个答案,设备就会做出响应
- 如果我们没有收到答案,设备处于脱机状态,请将其标记为脱机状态
- 切换到下一个设备,转到1
基本上,您应该能够将这里描述的代码包装成一个循环:提供异步串行端口通信
这是一个使用AutoResetEvent的示例。允许同步线程(在循环中发送请求的线程和在循环中接收消息的线程)的.Net多线程之一
在这些情况下,您寻址的机器正在响应(或至少假设是)单主机-多从机。含义:-
- 大师->嘿#1告诉我你的临时工->#1先生!是的,先生!23度
- 大师->嘿#2
这个想法是没有其他奴隶会回应。根据议定书的惯例。
除了这种串行系统之外,很难做任何事情。
在设计方面,如果您创建类似于命令队列的东西。每个命令都知道要与哪个设备对话,以及要问什么问题。处理每个命令,发送串行消息,获取响应,然后将其返回给命令。现在你有了一个命令,它知道它与哪个设备通信,以及该设备的响应是什么。
只要您只有一个正在等待响应的"运行中"命令,并且您知道将命令发送到哪个设备,就可以假设下一个响应的设备就是您要求响应的设备。现在,如果你的设备可以发送未提示的响应,那么这并不一定总是正确的。