Forum: Mikrocontroller und Digitale Elektronik Bitte um Hilfe bei einer Protokollerstellung


von Metaller (Gast)


Lesenswert?

Nachdem ich nun es geschafft habe meine uC’s über den PC (seriell) zu 
steuern, stellt sich mir die Frage nach einem Softwareprotokoll, welches 
aus einer 16Bit Adresse und aus einem 32Bit Datenpaket besteht, um so 
die einzelnen Komponenten anzusprechen. Wie könnte eine Start-/Stopp- 
bedingung aussehen ohne, dass diese schon als ein Teil der Nutzdaten 
erkannt wird?

Mir fällt dazu nix vernünftiges ein. Ich habe mir schon folgendes 
überlegt. Als Start würde ich <ESC> ($1B) und für die Stopp auch <ESC> 
senden und zähle ab dem ersten <ESC> die einzeln ankommenden Bytes bis 
wieder ein <ESC> kommt. Wenn nach dem sechsten Byte ein <ESC> kommt, 
dann war die Übertragung erfolgreich und das Datenpaket wird 
weiterverarbeitet, wenn nicht, dann wird das Paket verworfen. Als 
Bestätigung für eine i.O. Übertragung könnte man <ACK> ($06) und für 
eine n.i.O. Übertragung <NAK> ($15) zurücksenden.

Könnte so gehen, aber was meint Ihr dazu? Ginge das Ganze auch 
einfacher?

Vielen Dank... Metaller

von Philipp (Gast)


Lesenswert?

Bei jedem Binärprotokoll hast Du das Problem, daß Du ein Markerbyte 
nicht in den Nutzdaten ausschließen kannst. Wenn also in Deiner Adresse 
oder Deinen Daten ein $1B vorkommt, weißt Du nicht, ob es vielleicht ein 
Markerbyte ist. Durch Start und Stopp wird das ganze unwahrscheinlicher 
(es müßten zwei $1B hintereinander in den Nutzdaten vorkommen), aber 
nicht ausgeschlossen.

Ausschließen kann man es nur durch Stuffbytes, z.B.: ein $1B in den 
Nutzdaten wird immer von einem $00-Byte gefolgt, das beim Auslesen 
verworfen wird. Das Markerbyte wird dagegen von einem $01-Byte gefolgt. 
So ist der Marker immer auffindbar.

Variante 2, wenn ohnehin ein Handshake benutzt wird: gar keinen Marker, 
aber ein Prüfbyte (z.B. XOR über alles Bytes). Hinter jedem Datenpaket 
wird das Prüfbyte gesendet und der Sender wartet auf eine Antwort oder 
sendet nach x Millisekunden erneut. Der Empfänger hat ein Timeout beim 
Datenempfang, daß er nach knapp unter x Millisekunden seinen 
Empfangspuffer zurücksetzt.

von Metaller (Gast)


Lesenswert?

Danke Philipp für den Tipp !!!

Du hast mich auf eine Idee gebracht :) Ich benutze einfach die CTS/RTS 
Leitung für die Separierung der Datensätze und bilde die Prüfsumme aus 
dem Modulo256 des gesamten Datensatzes, so wie es auch bei meinem LCD 
gemacht wird.
So werde ich es machen, wenn keiner eine andere Idee hat.

von Castlerock (Gast)


Lesenswert?

Es gibt auch eine Fertige ansatz im i-net zu finden.

Google nach S.N.A.P  (Scaleable Node Address Protocol) von HTH

Es könnte genau deine anforderung abdecken.

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.