Forum: Mikrocontroller und Digitale Elektronik "Leichtes" Übertragungs-Protokoll


von Felix C. (felix_c13)


Lesenswert?

Hallo allerseits,
ich suche ein Übertragungsprotokoll für eine Point-to-Point-Verbindung, 
nur zwei Teilnehmer. Hardware-mässig soll das ganze mit einem UART 
laufen.

Am liebsten wäre es mir, könnte ich dem Protokoll einfach die zu 
sendenden Daten geben. Dieses sollte dann die Daten verschicken und auf 
eine Antwort warten, dass die Daten angekommen sind. Ist dies innerhalb 
eines gewissen Zeitrahmens nicht der Fall, werden die Daten nochmals 
geschickt, etc.

Das ganze sollte also quasi auf den OSI-Layern 1,2,4 laufen, den dritten 
braucht es ja eigentlich nicht wirklich.

Ich wäre froh, wäre das ganze keine 50KB-Horror-Library, weswegen ich 
auch nicht TCP nutzen möchte, sondern was kleines ;)

Ich habe schon das hier gefunden, beide kümmern sich allerdings nur um 
layer 1 und 2.

Glaub schonmal nicht schlecht, eigentlich für AVR ausgelegt, aber da 
fehlt ein Error-Handling
https://github.com/min-protocol/min/wiki

HDLC ist glaube ich etwas das gleiche, nur halt professioneller was?
https://de.wikipedia.org/wiki/High-Level_Data_Link_Control

Das sah eigentlich auch noch ganz nett aus, aber mir scheint das PPP 
auch nicht wirklich das wahre für mich ist.
http://www.ethernut.de/en/documents/ntn-1_ppp.html

Habt da irgendwelche Ideen für mich?


Gruss und Dank

Felix

von Codix (Gast)


Lesenswert?

Felix C. schrieb:
> eine Point-to-Point-Verbindung,
> nur zwei Teilnehmer.

Dann nimmst Du das einfachste Protokoll das seit der Steinzeit 
existiert.
Nannte sich LSV1. Da Du nur eine Punkt-zu-Punkt Verbindung hast brauchst 
Du den ganze Kram mit den Adresse überhaupt nicht.
Ich würde das so implementieren:

Senderichtung -> MASTER zum SLAVE (so scheint mir Dein Anliegen zu sein)
STX Daten EXT BCC ( BCC = Block Check Character [1 Byte] , BCC Prüfsumme 
ist XOR über alle Bytes)
Man kann, auch CRC16 hinten anhängen. Das geht am einfachsten über eine 
Tabelle. Aber das brauchst Du nicht bei dieser einfachen Kopplung.

Danach kommt vom Slave entweder ein einzelnes ACK oder NACK an den 
Master zurück.
Bei Timeout garnix.
Bei NAK, muss der Master das Paket wiederholen.

Wenn Du dann noch XON/XOFF darüber legst, hast Du auch noch die 
entsprechende Flußsteuerung.


That's easy!

von ??? (Gast)


Lesenswert?

Ja wat denn nun Hardware-UART oder was eigenes ?
Wenn Du seriell meinst gibt's z.B. schon I2C, One-Wire usw.
Die haben alle Handshake, Adressierung, ACK/NACK und CRC kann man leicht 
implementieren.
Aber wenn Du was eigenes willst dann überlege Dir was Du brauchst und 
male Dir eine Statemachine auf, die Du dann implementierst.
Nur das Rad immer wieder neu erfinden macht eigentlich keinen Sinn.

von Dr. Sommer (Gast)


Lesenswert?

Bei CAN geht das alles automatisch in Hardware inklusive Fehler 
Erkennung, da ist die Software simpel. Nebenbei auch sehr 
störunempfindlich und es ist simpel mehr als 2 Teilnehmer zu vernetzen. 
Nachteil: Geringe Datenrate, nur max. 8 Bytes pro Paket.

von W.A. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Geringe Datenrate, nur max. 8 Bytes pro Paket.

Wie kann ich aus der Paketgröße die Datenrate berechnen, um zu 
beurteilen, ob das für eine bestimmte Anwendung reicht?

von Sven L. (svenl)


Lesenswert?

Schau Dir mal Modbus RTU an!

Ist an sich sehr simpel aufgebaut und kann Paketgrößen bis 255 Words 
(512 Byte). Für das Übertragen von Prozessdaten nutze ich das gerne.

Wenn es keine zyklische Prozessdatenübertragung sein sollte, dann sind 
andere Protokolle besser geeignet, wie das zum Beispiel bereits genannte 
HDLC.

Viele Grüße!

Sven

von Knapp Daneben (Gast)


Lesenswert?

W.A. schrieb:
> Dr. Sommer schrieb:
>> Geringe Datenrate, nur max. 8 Bytes pro Paket.
>
> Wie kann ich aus der Paketgröße die Datenrate berechnen, um zu
> beurteilen, ob das für eine bestimmte Anwendung reicht?

Solche Fragen sind nichts für Dr. Sommer. Da muß man schon gezielt nach 
Zyklen oder so fragen.

von Stefan F. (Gast)


Lesenswert?

Deine Anforderungen entsprechen ziemlich genau TCP/IP. Dafür brauchst du 
nicht 50KB. Der µIP Stack von Adam Dunkels ist keine 8KB groß und 
benötigt nur für ein Datenpaket Pufferspeicher. Natürlich hat man dafür 
funktional Abstriche gemacht - aber für deine Anforderungen reicht's 
immer noch.

Sicher gibt es auch einfachere Protokolle. Ich wollte nur drauf 
hinweisen, das TCP/IP nicht unbedingt so groß und komplex ist, wie du 
denkst.

Wenn du mit einer hohen Fehlerrate rechnest, dann schau Dir mal Z-Modem 
an. Das ist eigentlich zur Übertragung von Dateien gedacht, aber an der 
Beschreibung des Protokolls kann man einiges abgucken. Es ist nämlich 
ganz gut durchdacht.

von Georg (Gast)


Lesenswert?

Codix schrieb:
> STX Daten EXT BCC

erinnert mich an Siemens, aber der Name dafür fällt mir im Moment nicht 
mehr ein. Sollte übrigens ETX heissen.

Georg

von Peter D. (peda)


Lesenswert?

Ich finde das SMALL PROTOKOLL der LCDs von ELECTRONIC ASSEMBLY recht 
einfach und sicher. Die Implementierung sollte deutlich unter 1kB Flash 
benötigen.

http://www.lcd-module.de/produkte/ediptft.html

von grundschüler (Gast)


Lesenswert?


von J. L. (lindenbaum)


Lesenswert?

Georg schrieb:
> Codix schrieb:
>> STX Daten EXT BCC
>
> erinnert mich an Siemens, aber der Name dafür fällt mir im Moment nicht
> mehr ein.

Du denkst vermutlich an 3964R: https://de.wikipedia.org/wiki/3964R

von Reiner O. (elux)


Lesenswert?

Codix schrieb:
> Senderichtung -> MASTER zum SLAVE (so scheint mir Dein Anliegen zu sein)
> STX Daten EXT BCC ( BCC = Block Check Character [1 Byte] , BCC Prüfsumme
> ist XOR über alle Bytes)

Genau!
Für meine Datenübertragungen benutze ich so etwas in der Art auch:

Startbyte (0x55)->(Adresse)->Längenbyte->Daten->Trennung->
Daten->Trennung....->Prüfbyte(s)(XOR)->Endmarkierung

Rückgabe "OK"(+Rückgabewerte),"ERROR"(+Fehlercode) oder nix.

Funktioniert hier einfach nur, auch in 433 MHz und mit mehreren 
Teilnehmern völlig schmerzfrei...

von Felix C. (felix_c13)


Lesenswert?

Hallo allerseits vielen Dank für all eure Antworten!!

Codix schrieb:
> Dann nimmst Du das einfachste Protokoll das seit der Steinzeit
> existiert.
> Nannte sich LSV1

Habe ich nicht gefunden, meintest du das da?
https://de.wikipedia.org/wiki/Transport_Layer_Security

??? schrieb:
> Ja wat denn nun Hardware-UART oder was eigenes ?
Ich glaube, ich hatte mich eigentlich ziemlich klar ausgedrückt, dass 
ich einen UART verwenden will...

W.A. schrieb:
> Wie kann ich aus der Paketgröße die Datenrate berechnen, um zu
> beurteilen, ob das für eine bestimmte Anwendung reicht?

Ich habe sowieso nur wenige Daten, aber eigentlich wird bei einer 
kleinen Paketgrösse die Geschwindigkeit durch das Verhältnis Daten zu 
Header, Prüfsumme bestimmt.

grundschüler schrieb:
> einfachst, zuverlässig, flexibel:
>
> Beitrag "owx 1Wire Protokoll für Datenaustausch und Steuerung"

xDDD, wie wärs wenn ich einfach auf diese ganze Elektronik verzichte und 
Flaschenpost verschicke ;)

Codix schrieb:
> Senderichtung -> MASTER zum SLAVE (so scheint mir Dein Anliegen zu sein)
Ne ich will eigentlich, dass beide selbstständig sind, also kein 
Master/Slave-System.

Die Lösung die ich nun verwende:

https://github.com/min-protocol/min
Wie bereits viele von euch vorschlugen, werden Frames mit Prüfsummen 
verwendet. Diese extrem kleine Lib erledigt dies für mich. So kann ich 
mir sicher sein, dass alle erhaltenen Daten stimmen.

Weiter, jede meiner Daten hat eine eigene Kennnummer. Wird ein Frame 
gesendet, ist die Aufteilung der Bytes immer so:
Kennnummer, Daten, Kennnummer, Daten etc.
Werden Daten versendet startet ein Timeout, nach dessen Ablaufen die 
Daten wiederholt gesendet werden. Zu allen Daten gibt es eine 
"Ack_Kennnumer" so muss der Receiver immer wenn er Daten erhält, diese 
bestätigen.

Selbst wenn die Verbindung nun komplett getrennt würde, also 
physikalisch, wäre also gewährleistet, dass die Verbindung ohne jegliche 
Reset-Routinen wieder läuft, also wenn man wieder das Kabel einsteckt 
zB.

Btw. das ganze ist für ein ROV-Projetk (ferngesteuertes U-Boot ;)), ich 
habe also realitv kleine Datenmengen.

Gruss

Felix

von Georg (Gast)


Lesenswert?

Felix C. schrieb:
> Wie bereits viele von euch vorschlugen, werden Frames mit Prüfsummen
> verwendet.

Zusätzlich schlage ich vor, ASCII-Text zu senden, keine Roh-Bytes. Das 
erleichtert das Debuggen sehr, und du musst keine Klimmzüge unternehmen, 
um Bytes zu senden, die wie CR, LF, STX, ETX usw. aussehen. Die grössere 
Datenmenge spielt nur sehr selten eine Rolle. Im Internet wird auch i.A. 
Text übertragen.

J. L. schrieb:
> Du denkst vermutlich an 3964R

Genauuuu... ist aber eigentlich auch schon zu kompliziert.

Georg

von Codix (Gast)


Lesenswert?

Georg schrieb:
> erinnert mich an Siemens, aber der Name dafür fällt mir im Moment nicht
> mehr ein. Sollte übrigens ETX heissen.

Hatte ich geschrieben, dass es LSV1 genannt wurde. Und ja, es stammt von
Siemens. Wurde in der TRANSDATA-Welt (80er Jahre)eingesetzt.

Ja, sollte ETX lauten, danke für die Korrektur.

Felix C. schrieb:
> Habe ich nicht gefunden, meintest du das da?

Darüber findest Du im Wiki und Google nichts. Ist schon zu alt.

Felix C. schrieb:
> Ne ich will eigentlich, dass beide selbstständig sind, also kein
> Master/Slave-System.

Kannst Du für beide Seiten verwenden. Dann solltest Du aber ein 
Protokoll-Schritt davor schalten. D.h. den Geräten eine Adresse 
zuweisen. Anhand derer kannst Du feststellen, ob der Gegenüber bereit 
ist zu empfangen.

Warum machst Du es Dir so schwer, Du kannst Dir doch Dein eigenes 
Protokoll aus den Fingern saugen. Musst doch mit nix kompatibel sein.

von W.G. (Gast)


Lesenswert?

Siemen USS
 https://cache.industry.siemens.com/dl/files/253/24178253/att_101236/v1/uss_24178253_spez_00.pdf

wäre z.B. ein UART typisches Protokoll. Der Nachfolger geht über 
Ethernet und heißt Modbus.

von Milchkanne (Gast)


Lesenswert?

Georg schrieb:
> im Internet wird auch i.A. Text übertragen.
Wo wird denn im Internet noch Text übertragen? HTML/CSS/JS wird quasi 
immer zlib komprimiert, Bilder sind sowieso binärdaten.
Selbst wenn POP3 theoretisch Base64 codiert Anhänge überträgt, dann doch 
im normalfall verschlüsselt.
Das Internet ist schon lange im 8-bit pro Byte Zeitalter angekommen.

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.