Forum: Mikrocontroller und Digitale Elektronik RS485 Protokoll im Eigenbau


von Tobias S. (Gast)


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

von TestX .. (xaos)


Lesenswert?

da brauchst du wohl escape sequenzen oder machst es wie zB bei DMX und 
sendest einen "frame error" den du als "start of frame" benutzt

von Peter II (Gast)


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.

von TomA. (Gast)


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

von Peter II (Gast)


Lesenswert?

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.

von Tobias S. (Gast)


Lesenswert?

Ich versteh kein Wort. Was macht dieser Frame-Error?

von Tobias S. (Gast)


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

von Tobias S. (Gast)


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.

von Peter II (Gast)


Lesenswert?

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.

ja, aber das ist doch meist eh der fall.

von m.n. (Gast)


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'.

von Jürgen D. (poster)


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.

von ich (Gast)


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?

von Jürgen D. (poster)


Lesenswert?

Im Datenstrom kann keine 0x1B 0x00 vorkommen, das wird als 0x1B 0x01 
0x00 gesendet.
Daher ja auch das Ersetzen einen normalen 0x1B in 0x1B 0x01 :)

von ich (Gast)


Lesenswert?

Jürgen D. schrieb:
> Im Datenstrom kann keine 0x1B 0x00 vorkommen, das wird als 0x1B
> 0x01
> 0x00 gesendet.
> Daher ja auch das Ersetzen einen normalen 0x1B in 0x1B 0x01 :)

Ah, jetzt ist der Groschen gefallen, alles klar :-))
Danke!

von Peter II (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.