UART und Datenpakete



  • Ich kenne keines das Start-/Stop-Symbole verwendet und gleichzeitig unbeschränkte 8-bittige Binärdaten als Paketinhalt erlaubt.

    Die seriellen Protokolle mit denen ich bereits gearbeitet habe sind cctalk, EBDS und ID003.

    Die verwenden aber alle Längenangaben. Und werden üblicherweise so verwendet dass einer Chef ist, der schickt nen Request, und der andere Antwortet immer nur. Erkennen von fehlerhaft/unvollständig übertragenen Paketen macht man dabei üblicherweise über Timeouts und das Checken der entsprechenden Fehler-Bits des UARTs (Framing-Error, Parity-Error etc.).

    Weiters ist bei diesen Protokollen meist eine maximale Pause vorgeschrieben, zwischen zwei Bytes die zur selben Nachricht gehören. Wenn man länger als diese Zeit nix empfangen hat, dann kann man davon ausgehen, dass das nächste Byte das daherkommt den Anfang eines Pakets darstellt.

    Weiters gibt es dann z.B. noch Prüfsummen (z.B. XOR8, CCITT16).

    Alles zusammen führt zu "sehr guten" Fehlerraten.

    Wobei die Frage nicht unwichtig ist welche Art von Problemen wie oft vorkommen wird. Wenn z.B. die Line furchtbar dreckig ist, und dauernd umgefallene Bits ankommen, dann braucht man was anderes, als wenn man ne sehr saubere Line hat, wo aber z.B. kein exaktes Timing eingehalten werden kann.

    Bei umgefallenen Bits sind Prüfsummen und ECC Mechanismen gut. Da man damit gut erkennen bzw. u.U. korrigieren kann wenn eben Bits falsch angekommen sind. Ebenso hilft hier der UART wenn er z.B. Framing-Fehler gut erkennen kann.

    Bei Timingproblemen helfen dagegen eher reservierte Start-/Stop-Symbole. Da man damit eben gut "re-synchronizen" kann. Also mit sehr hoher Sicherheit sagen welches Byte den Anfang einer Message darstellt.
    (Re-synchronizen geht natürlich auch mit Hilfe von Prüfsummen, aber nicht so sicher, und vor allem wird der Code dazu schnell sehr kompliziert. Speziell wenn man so schnell wie möglich einen neuen Einstiegspunkt finden möchte.)



  • Achtung Achtung, hier fängt mein Posting an!

    hustbaer schrieb:

    @volkard
    bitte entweder ordentlich mitlesen, oder spar dir deinen Zynismus.

    Hab keine Zeit mehr, immer sogar auch alle Wörter Deiner Beiträge zu lesen. Da kanns schon mal zu einem kleinen Mißverständnis kommen, sorry.



  • UART newbie schrieb:

    Bisher gehe ich dabei so vor, dass ich am Anfang jedes Datenpakets 2 Bytes mit der Größe des Datenpakets mitschicke.

    oder bloß ein Byte für die Größe und sowas wie Zahlen <=127 sind ok und >127 sind das negierte hi-Byte und das low-Byte folgt gleich.
    https://ja.wikipedia.org/wiki/可変長数値表現



  • fenrayn schrieb:

    Den Encoder fütter ich mit kompletten Datenpaketen (push), und die entsprechenden zu sendenden bytes kann man dann mit einer pop-funktion rausholen.
    Beim Decoder ist das entsprechend andersrum.

    Ähm, dann darfste ja quasi *alles* machen.
    RLE https://de.wikipedia.org/wiki/Lauflängenkodierung
    LZ4 https://de.wikipedia.org/wiki/LZ4



  • Ich habe ein Protokoll gefunden, das dem was ich vor habe sehr ähnlich ist:
    https://de.wikipedia.org/wiki/Serial_Line_Internet_Protocol

    Dort wird sogar auf das Startbyte verzichtet.

    Danke Hustbaer und Volkard für die sehr hilfreichen Tipps 🙂



  • volkard schrieb:

    Achtung Achtung, hier fängt mein Posting an!

    hustbaer schrieb:

    @volkard
    bitte entweder ordentlich mitlesen, oder spar dir deinen Zynismus.

    Hab keine Zeit mehr, immer sogar auch alle Wörter Deiner Beiträge zu lesen. Da kanns schon mal zu einem kleinen Mißverständnis kommen, sorry.

    Und ich habe keine Zeit dir zu erklären wie Beiträge wie diese deine z.T. unglaubliche Überheblichkeit zum Ausdruck bringen.



  • // Edit
    Hat sich erledigt 😛


Anmelden zum Antworten