1

我有一个 Java 程序,它不断地在串行端口上侦听某种格式的消息。当发送方应用程序不发送消息时,它会以以下格式发送心跳消息:

  • 字节 1:1
  • 字节 2:0xFE
  • 字节 3:0xED
  • 字节 4-255: 0

如果接收方应用程序在发送方之前启动,则一切正常,但是,如果发送方一直在发送心跳,则几乎可以肯定接收方在启动时将在心跳消息中间开始监听(这是一个问题因为我读取了 255 个字节的块,因为每条消息都是 Reed-Solomon 编码的)。我写了一个同步函数,它是一个简单的状态机。它一次读取 1 个字节,条件如下:

  • 如果我只是读到一个 1: 切换到 NEW_MESSAGE 状态。

  • 如果我只是读取 0xFE:切换到 POTENTIAL_HEARTBEAT 状态。

  • 如果我只是读到一个 0xED: 切换到 HEARTBEAT 状态

进行了相关检查以确保这些状态不会乱序到达,一旦我达到 HEARTBEAT 状态,我会读取剩余的 252 个 0 并假设接收器已同步。在到目前为止的测试中,尽管发送了正确的字节以有效地触发同步,但该同步器仍无法正常工作。我的问题是:有没有更好的方法来同步串行通信,因为我真的一点也不喜欢我的方法。

4

2 回答 2

1

问题实际上只是我忘记了位排序的重要性。我正在读取的字节通道是小端序,因此 16 位整数 0xFEED 以 0xED 0xFE 而不是 0xFE oxED 的形式出现在我面前。通过状态检查中的简单开关,一切正常。

衷心感谢所有评论。

于 2010-08-19T15:42:54.197 回答
0

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

于 2010-08-16T14:16:26.083 回答