RS485 Protokoll im Eigenbau

Gast #3610117
Lesenswert?

Hallo zusammen,

ich möchte mir selbst ein kleines Protokoll für die Kommunikation über 
RS485 schreiben.

Nun war mein Aufbau wie folgt geplant:
Startzeichen  Bsp: 0x40 (@ Zeichen)
Adressbyte    Bsp: 0x02
Länge der Datenbytes:  Bsp: 0x10
Datenbytes
und CRC (optional)

Jetzt stell ich mir allerdings die Frage, wie ich verhindern kann, dass 
0x40 in der Adresse oder den Daten vorkommt. Bei Homematic wird aus 0xFD 
als Startzeichen 0xFC und 0x7D. Nur, stimmt ja dann der Frame überhaupt 
nicht mehr. Also bräuchte ich ja für alle Bytes noch ein zweites zum 
Ausweichen.

Wenn 0x40 dann allerdings nicht in den anderen Bytes vorkommt, müsste 
ich das jeweils 2. Byte zum Ausweichen ja leer senden. Aber auch das 
geht ja nicht, da 0x00 ja NULL entsprich und damit der Terminierung von 
Strings oder?

Wäre sehr dankbar für ein paar Tipps
Gruß Tobias
Gast #3610129
Lesenswert?

ist eigentlich egal wenn das Startzeichen in den Daten vorkommt. Du 
musst ja nicht auf jedes Startzeichen neu synchronisieren.

Wenn die Übertragung anfängt, wartest du auf der 1. Startzeichen. Dann 
liest du das packet ein ohne weiter Startzeichen zu beachten. Wenn die 
CRC nicht stimmt, dann ist das packet ungültig.

Das nächste Packet beginnt wieder mit einen Startzeichen, spätestens 
nach ein paar packet ist wieder alles ok.
Gast #3610137
Lesenswert?

Hallo,

nimm für Steuerfunktionen die im ASCII-Code dafür vorgesehenen Zeichen 
im Bereich 00h - 1Fh. Da gibt es schon vordefiniert z.B: STX - Start of 
Text, ETX - End of Text usw. Für die Daten verwende die Buchstaben- und 
Ziffern-Codes, so gibt es keine Doppeldeutigkeiten.

Gruß. Tom
Gast #3610153
Lesenswert?

Peter II schrieb:
> TomA. schrieb:
>> Für die Daten verwende die Buchstaben- und
>> Ziffern-Codes, so gibt es keine Doppeldeutigkeiten.
>
> dafür ist es aber eine recht dumme Verschwendung von Bandbreite.

Ja das denke ich auch.
Ich möchte die Datenbytes halt recht klein halten
Gast #3610164
Lesenswert?

Peter II schrieb:
> ist eigentlich egal wenn das Startzeichen in den Daten vorkommt.
> Du
> musst ja nicht auf jedes Startzeichen neu synchronisieren.
>
> Wenn die Übertragung anfängt, wartest du auf der 1. Startzeichen. Dann
> liest du das packet ein ohne weiter Startzeichen zu beachten. Wenn die
> CRC nicht stimmt, dann ist das packet ungültig.
>
> Das nächste Packet beginnt wieder mit einen Startzeichen, spätestens
> nach ein paar packet ist wieder alles ok.

Dann muss ich aber an allen Slaves jedes Paket komplett auslesen oder?
Egal ob der µC damit im Nachhinein was macht oder nicht.
Gast #3610174
Lesenswert?

Tobias S. schrieb:
>> dafür ist es aber eine recht dumme Verschwendung von Bandbreite.
>
> Ja das denke ich auch.
> Ich möchte die Datenbytes halt recht klein halten

Welche Baudrate soll es denn werden?
Erst dann kann man sehen, ob es eine Verschwendung von Bandbreite gibt 
und ob das unbedingt dumm ist.

Sieh Dir mal den Inhalt einer Intel .hex-Datei an. Da wird auch viel 
Speicherplatz 'verschwendet'. Keiner wird das als dumm bezeichnen.

Tobias S. schrieb:
> Dann muss ich aber an allen Slaves jedes Paket komplett auslesen oder?
> Egal ob der µC damit im Nachhinein was macht oder nicht.

Stichwort: Multiprozessor-Modus, dummerweise wird dabei allerdings 
Bandbreite durch ein 9. Bit 'verschwendet'.
#3610258
Lesenswert?

Ich habe bei Protokollen bei denen alle Zeichen im Datenstrom vorkommen 
können mal so eine Konstuktion gesehen:
Aus dem Zeichen 0x40 wird im Datenstrom 0x1B 0x00
Willst du das Zeichen 0x1B im Datenstrom senden wird daraus 0x1B 0x01.

Bei der Lösung die ich gesehen hatte wurde die Telegrammlänge nicht 
verändert.
Die Empfangsroutine hat die Umwandlung selber Rückgängig gemacht, 0x40 
oder 0x1B in den Empfangsbuffer geschrieben und den Zeichenzähler nur um 
eins erhöht.

Eine andere Lösung hat zwischen Telegrammen eine gewisse Pause erwartet, 
die es zwischen den Zeichen eines Telegrammes nicht geben durfte. nur 
ein Zeichen nach einer Pause konnte ein Startzeichen sein.
Gast #3610273
Lesenswert?

Jürgen D. schrieb:
> Aus dem Zeichen 0x40 wird im Datenstrom 0x1B 0x00
> Willst du das Zeichen 0x1B im Datenstrom senden wird daraus 0x1B 0x01.

Und mal den Gedanken weiter gedacht: was passiert, wenn im Datenstrom 
wirklich 0x1B 0x00 vorkommt? Dann macht dein Empfänger ein 0x40 draus. 
Und bei 0x1B 0x01 macht er 0x1B draus. Und beides wäre beim Vorkommen im 
Datenstrom eine falsche Interpretation. Oder wird das dann auch 
irgendwie abgefangen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren