使用RXTX同步Java串行端口连接

时间:2010-08-16 13:28:27

标签: java synchronization serial-communication

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

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

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

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

  • 如果我只读了一个0xFE:切换到POTENTIAL_HEARTBEAT状态。

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

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

2 个答案:

答案 0 :(得分:1)

问题实际上只是我忘记了位排序的重要性。我正在读取的字节通道是小端,因此16位整数0xFEED作为0xED 0xFE而不是0xFE oxED来到我身边。通过一个简单的状态检查开关,一切都工作了桃子王。

真诚地感谢所有评论。

答案 1 :(得分:0)

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