Labor-Octet-Protocol

Aus LaborWiki
Wechseln zu: Navigation, Suche

In diesem Artikel ist ein Byte ein Oktet, also ein Datenwort der Länge 8 Bit.

LOP-Logo.png

About[Bearbeiten]

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[Bearbeiten]

Überblick[Bearbeiten]

Escape-Schicht[Bearbeiten]

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[Bearbeiten]

0x42 Reset[Bearbeiten]

0x23 0x14 Message[Bearbeiten]

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[Bearbeiten]

Die Sequenz 0x23 0x15 stellt eine besondere Markierung im Datenstrom da, und ist für Synchonisierungszwecke geeignet.

Implementierung[Bearbeiten]

AVR-Mikrocontroller[Bearbeiten]

Eine Implementierung des LOP für AVR-Mikrocontroller ist unter [1] zu finden. Auf diese Implementierung beziehen sich auch die folgenden Aussagen.

Konzept[Bearbeiten]

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;