Labor Octet Protocol
Labor Octet Protocol Release status: unknown [box doku] | |
---|---|
Description | Nachrichten und Stream-Daten über einen seriellen Bytestream übertragen |
In diesem Artikel ist ein Byte ein Oktet, also ein Datenwort der Länge 8 Bit.
About
Das Labor-Octet-Protocol (LOP) stellt sowohl eine nachrichten- als auch eine streamorientierte Möglichkeit der Kommunikation zur Verfügung.
Das Protokoll geht dabei von einer byteorientierten, tieferliegenden Kommunikationsschicht aus und nimmt insbesondere Rücksicht darauf, dass die atomare Übertragungsgröße 8 Bit ist.
Aufbau
Überblick
Escape-Schicht
Um (atomare) Kommandos zu ermöglichen, werden einigen Bytes spezielle Kommandos zugeordnet. Um jedoch diese Werte auch im normalen Datenstrom zu übermittlen, findet ein so genanntes Escaping statt.
Kommandozeichen | Bedeutung |
0x42 | Reset |
0x23 | Escape |
Escape-Sequenz | Daten |
0x23 0x01 | 0x42 |
0x23 0x02 | 0x23 |
0x23 0x03 | 0x11 |
0x23 0x04 | 0x13 |
Die zwei zusätzlichen Escape-Sequenzen ermöglichen ein normales Software-Flowcontrol (XON/XOFF), wie es bei seriellen Leitungen häufig gewünscht ist.
Kommandos
0x42 Reset
0x23 0x14 Message
Die Sequenz 0x23 0x14 leitet eine Message ein. Es folgen zwei Bytes, die zusammen die Länge der Nachricht in Bytes angeben, wobei hier die Network-Byteorder zum Tragen kommt, d.h. dass erste Längenbyte ist das MSB und wird vom LSB gefolgt. Anschließend werden die Datenbytes der Nachricht übertragen.
0x23 0x15 Stream Sync
Die Sequenz 0x23 0x15 stellt eine besondere Markierung im Datenstrom da, und ist für Synchonisierungszwecke geeignet.
Implementierung
AVR-Mikrocontroller
Eine Implementierung des LOP für AVR-Mikrocontroller ist unter [1] zu finden. Auf diese Implementierung beziehen sich auch die folgenden Aussagen.
Konzept
Die Nutzung basiert auf dem Umgang mit einem sogenannten LOP-Kontext, welcher alle Informationen zum Status und zur Verwaltung des Protokolls enthält. Auch sind in diesem Kontext die Adressen jener Funktionen gespeichert, welche bei bestimmten Ereignissen (z.B. eingehende Message, Empfangen einer Sync-Sequenz) aufgerufen werden sollen.
Durch die Hinterlegung entsprechender Funktionszeiger wird auch eine gewisse Ereignisorientiertheit implementiert, welche es erlaubt, Teile der Anwendung nebenläufig zu implementieren.
Code: LOP-Kontext |
typedef struct lop_ctx { lopstates_t rxstate, txstate, msgretstate; uint32_t msgidx; uint16_t msglength; uint8_t* msgbuffer; uint8_t escaped; void (*sendrawbyte)(uint8_t); /* pointer to the writing function */ void (*on_msgrx)(uint16_t, uint8_t*); /* function called on message recieve */ void (*on_streamrx)(uint8_t); /* function called on recieve of a stream byte*/ void (*on_streamsync)(void); /* function called on recieve of streamsync */ } lop_ctx_t; |