Domanda

Ho un programma Java che ascolta continuamente i messaggi di un certo formato su una porta seriale. Quando l'applicazione mittente non è l'invio di messaggi, invia messaggi heartbeat nel seguente formato:

  • byte 1: 1
  • byte 2: 0xFE
  • byte 3: 0xED
  • byte 4-255: 0

Se l'applicazione ricevitore è iniziato prima che il mittente, tutto funziona correttamente, tuttavia, se il mittente è stato buttare giù i battiti cardiaci, è quasi certo che il ricevitore, quando ha iniziato, inizierà l'ascolto nel bel mezzo di un messaggio di battito cardiaco (che è un problema perché ho letto in blocchi di 255 byte da ciascun messaggio è Reed-Solomon codificati). Ho scritto una funzione di sincronizzazione che è una semplice macchina a stati. Si legge 1 byte alla volta con le seguenti condizioni:

  • Se ho appena letto un 1:. Interruttore allo stato NEW_MESSAGE

  • Se ho appena letto un 0xFE:. Interruttore allo stato POTENTIAL_HEARTBEAT

  • Se ho appena letto un 0xED: interruttore per lo stato HEARTBEAT

controlli necessari siano in atto per garantire che questi Stati non può essere arrivato al momento fuori servizio, e una volta ho raggiunto lo stato di battito cardiaco, ho letto i restanti 252 0 e assumono il ricevitore è stato sincronizzato. In prove finora, questo sincronizzatore non ha funzionato correttamente nonostante i byte corretti inviati giù per attivare efficacemente una sincronizzazione. La mia domanda è questa:. C'è un modo migliore per sincronizzare le comunicazioni seriali, perché io davvero non mi piace il mio metodo a tutti

È stato utile?

Soluzione

Il problema è stato in realtà solo a me dimenticare l'importanza del bit ordinazione. Il canale di byte che stavo leggendo era da little endian in modo che il 16 bit integer 0xFEED stava venendo a me come 0xED 0xFE invece di 0xFE oxED. Con un semplice interruttore nel controllo dello stato, tutto funziona re peachy.

Un grazie sincero a tutti che ha commentato.

Altri suggerimenti

Estendere la macchina dello Stato e di controllo per gli ultimi 3 byte ricevuti. li comapre ai primi 3 byte del messaggio battito cardiaco. Come i primi 3 byte sembra essere sempre lo stesso, è possibile utilizzare questo per rilevare l'inizio del messaggio battito cardiaco e fare la vostra sincronizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top