2010-08-16 7 views
1

직렬 포트에서 특정 형식의 메시지를 지속적으로 수신하는 Java 프로그램이 있습니다.RXTX를 사용하여 자바 직렬 포트 연결 동기화

  • 바이트 1 : 1
  • 바이트 2 내지 0xFE
  • 바이트 3 : 0xED
  • 바이트 4-255 전송자 애플리케이션은 메시지를 전송하지 않은 경우, 다음과 같은 형식으로 하트 비트 메시지를 전송한다 : 0

송신자 전에 수신자 응용 프로그램이 시작되면 모든 기능이 올바르게 작동하지만 발신자가 하트 비트를 내 보내면 수신자가 시작될 때 수신 대기가 거의 확실합니다. 하트 비트 메시지의 iddle (각 메시지가 Reed-Solomon으로 인코딩됨에 따라 255 바이트 덩어리로 읽히기 때문에 문제가됩니다.) 나는 간단한 상태 기계 인 동기화 기능을 썼다. 다음과 같은 조건으로 한 번에 1 바이트를 읽습니다.

  • 방금 ​​읽은 경우 NEW_MESSAGE 상태로 전환합니다.

  • 방금 ​​0xFE :를 읽은 경우 POTENTIAL_HEARTBEAT 상태로 전환하십시오.

관련 검사 이러한 상태는 순서가에 도달 할 수 없음을 보장하기 위해 자리에 하트 비트 상태로 스위치를 한 번 나는 HEARTBEAT에 도달했습니다 :

  • 은 그냥 0xED를 읽는다면 상태, 나는 나머지 252 0을 읽고 수신기가 동기화되었다고 가정합니다. 지금까지 테스트에서 동기화를 효과적으로 트리거하기 위해 올바른 바이트가 보내 졌음에도 불구하고이 동기화 기가 올바르게 작동하지 않았습니다. 제 질문은 이것입니다 : 직렬 통신을 동기화하는 더 좋은 방법이 있습니다. 왜냐하면 저는 제 방법이 전혀 마음에 들지 않기 때문입니다.

  • +0

    "제대로 작동하지 않는다"고 말하면 어떻게됩니까? 물론 간단한 FSM이 실패하는 이유를 확인하기 위해 상태 머신 입력 및 전환 추적을 작성할 수 있습니다. –

    답변

    1

    문제는 실제로 비트 정렬의 중요성을 잊어 버렸습니다. 내가 읽었던 바이트 채널은 리틀 엔디안 이었으므로 16 비트 정수 0xFEED가 0xFE 0xED 대신 0xED 0xFE로 나에게 올 것입니다. 상태를 확인하는 간단한 스위치로 모든 것이 복숭아 왕이됩니다.

    감사의 말에 감사드립니다.

    0

    상태 시스템을 확장하고 마지막으로 수신 된 3 바이트를 확인하십시오. 그들을 하트 비트 메시지의 처음 3 바이트에 모으십시오. 처음 3 바이트가 항상 같기 때문에 하트 비트 메시지의 시작 부분을 감지하고 동기화를 수행 할 수 있습니다.

    +0

    특정 하트 비트 메시지가 어디서부터 읽기 시작하는지 알 수있는 방법이 없으므로 한 번에 1 바이트 씩 읽어야합니다. 예를 들어 다음 바이트를 읽기 시작한다고 가정 해보십시오. 0 0 0 0 1 FE ED 0 0 0 한 번에 3 바이트를 읽으면 [0,0,0] [0,0 , 1] [FE, ED, 0] ... 그리고 하트 비트를 완전히 그리워합니다. – JDS

    +0

    그의 FSM은 이미 세 개의 별개 상태 (IDLE 상태 이외에 있다고 가정 함)를 사용하여 마지막으로받은 바이트를 확인합니다. –