Hallo!
Auch von mir noch ein etwas anderer Ansatz bei variabler Telegrammübertragung ebenfalls mit Start/Endbyte, bei welchem die Eindeutigkeit dieser gesichert ist. Allerdings müssen dazu mindestens die Nutzdaten und wenn benötigt (Sicherheitsstufe) die Prüfsumme codiert werden. Die Prüfsumme würde ich prinzipiell über alles, ausgenommen Start/Endbyte, nehmen.
Aufbau:
- 1. Byte Startbyte (0xAA)
- 2. Byte Sender (0xFF)
- 3. Byte Empfänger (0xF1)
- 4...18 Nutzdaten (H/L codiert)
- 0xA3 (wird zu 0x0A und 0x03)
- 0x3C (wird zu 0x03 und 0x0C)
- usw...
- 19/20. Prüfsumme XOR (0xA4 -> H/L codiert)
- 0x0A
- 0x04
- 21. Endbyte (0xBB)
Start/Endbyte sind natürlich so zu wählen, dass keine Dopplung mit den Master/Slave Adressen auftreten kann. Ist dies nicht zu realisieren, müssen diese ebenfalls codiert werden.
Das ganze kann man ebenfalls im eigenen Tread/IRQ autark laufen lassen, allerdings kann man grundsätzlich beim Empfang des Startbytes zurücksetzen und bis zum Erreichen des Endbyte einlesen, da diese eindeutig sind und nicht in den anderen Daten vorkommen können.
Nachteil ist, dass sich das Volumen der Nutzdaten/Prüfsumme erhöht und deshalb bei Volumentarifen ungünstig ist.
Somit passiert folgendes beim Empfang des obigen Beispiels:
- Startbyte 0xAA empfangen -> Reset Counter
- Bytes lessen -> Bufferspeicher (counter++)
- Byte ist Endbyte 0xBB
- Bufferspeicher auswerten
- Adressen 0xFF/0xF1 -> OK
- decodieren
- XOR über alle Byte (außer Start/Endbyte) –> vergleich mit Prüfsumme -> OK Telegramm empfangen!
Um nicht unnötig lesen zu müssen können auch unterschiedliche Start/Endbyte je Richtung festgelegt werden. Also Slave -> Master z.B. 0xAA/0xCC und Master -> Slave 0xBB/0xDD.
Für ein besseres Fehler/Wiederholungsandling kann man auch noch die Information „Anzahl der Telegramme“ und „Nummer des aktuellen Telegramms“ einbinden.
- 4. Byte Anzahl Telegramme (0x04)
- 5. byte Aktuelles Telegramm (0x02)
Könnte die Anzahl der zusammengehörigen Telegramme die Werte des Start/Endbytes erreichen müssten diese ebenfalls innerhalb der Codierung mitgeführt werden.
Und je nach Sicherheitsstufe ist es natürlich auch noch möglich die Information „Anzahl der Bytes“ innerhalb des Telegramms codiert zu hinterlegen.
Gruß André
Lesezeichen