我有一个Java程序,该程序不断听取串行端口上某种格式的消息。当发件人应用程序未发送消息时,它将以以下格式发送心跳消息:

  • 字节1:1
  • 字节2:0xfe
  • 字节3:0xed
  • 字节4-255:0

如果接收器应用程序是在发件人之前启动的,则所有内容都正常运行,但是,如果发件人一直在丢下心跳,几乎可以肯定的是,接收器启动时,将开始在心跳消息的中间聆听(这是一个问题因为我读了255个字节的块,每个消息都是reed solomon编码的)。我编写了一个简单的状态计算机的同步函数。它一次读取1个字节,具有以下条件:

  • 如果我只是阅读1:切换到new_message状态。

  • 如果我只是读取0xFe:切换到势_heartbeat状态。

  • 如果我刚刚阅读0 XED:切换到心跳状态

进行相关的检查,以确保这些状态不能过失,并且一旦到达心跳状态,我就会阅读剩余的252 0,并假设接收器已同步。到目前为止,在测试中,尽管发送正确的字节以有效触发同步,但该同步器尚未正确工作。我的问题是:有没有更好的方法来同步串行通信,因为我真的不喜欢我的方法。

有帮助吗?

解决方案

问题实际上只是我忘记了位订购的重要性。我正在阅读的字节频道是小的endian,所以16位整数0xFeed以0 Xed 0xfe而不是0xfe ox ox ox。通过在州检查中进行简单的开关,一切都起作用。

衷心感谢所有评论。

其他提示

扩展您的状态机,并检查最后3个接收的字节。他们将他们转到您的心跳消息的前3个字节。由于前3个字节似乎总是相同的,因此您可以使用它来检测心跳消息的开头并执行您的同步。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top