Forum: Mikrocontroller und Digitale Elektronik sehr variable Datenrate auf UART managen


von Herbert (Gast)


Lesenswert?

Ich soll mit einem Microcontroller eine nicht spezifizierte Datenrate 
einer UART ermitteln und dann Daten empfangen. Bekannt ist, dass das 
anzuschließende Gerät mit 9600 ... 115k senden wird, Parity und 
Stoppbits sind offen.

Problem1: Gerät wird angeschlossen und pulst die Daten raus. Alles muss 
empfangen werden ohne einen Vorlauf auf den man sich einpendeln könnte.

Problem2: Die Geräte werden in der Hitze und vor allem der Kälte 
betrieben. Im Namib-Modus / Alaska-Modus haben die Taktraten die 
ausserhalb der 2% Abweichung liegen, welche unsere UART-Chips 
verkraften.

Ich brauche also eine Format-Rate-Schaltung mit angeschlossener 
Dekodierung.

Wie macht man das am Klügsten?

von DAVID B. (bastler-david)


Lesenswert?

Herbert schrieb:
> Wie macht man das am Klügsten?

Dem sender VOR dem sender zusagen es soll eine info senden was der 
emfänger zu erwarten hat dann erst auswerten muss und sich drauf 
einstellen Kann ?

serielle Verbindung öffnen mit 9600 und sagen du ich sende jetzt mit xyz 
Verbindung schlissen und ein paar ms warten und los senden?

Oder dem Empfänger RATEN/testen lassen und dabei Daten verliehen ?

Gibt es schon infos welche Geräte da senden sollen ?

: Bearbeitet durch User
von Max D. (max_d)


Lesenswert?

Also wenn die Gegenseite ohne Pause zwischen Bytes Daten rausbläst gibt 
es keine garantierte Methode um die datenrate zu ermitteln.

Ein 0101 Datenstrom kann je nach datenrate entweder 0f(hex) bei 
datenrate x oder 0f0f(hex) bei datenrate 2x sein.

Man kann zwar datenraten ausschließen indem man minimale/maximale Zeiten 
misst, aber ohne Wissen über den Inhalt der Daten ist das stochern im 
Nebel (quasi datenRATEN).

von dunno.. (Gast)


Lesenswert?

Das einfachste wäre, es gäbe eine feste Präambel, idealerweise mit 
Flankenwechsel nach dem start-bit, dann kannst du die baudrate messen 
(autobaud)

Wenn du das alles nicht hast, bleibt vermutlich nur den bitstrom sampeln 
und im nachgang irgendwas überlegen...

von Herbert (Gast)


Lesenswert?

zu den beiden Rückfragen:

Die Daten kommen gepulst, also mit Pausen. Ich kann natürlich ein 
Startbit erkennen. Es ist nur nicht klar, ob es ein Stoppbit gibt. Die 
Daten sind aber ausreichend lang, um  zu erkennen, ob es z.B. 4x8, 4x9 
oder 4x10 Bits sind. Zwischen Stopp und Start gibt es auch eine minimale 
Pause.

Dem Sender kann ich nichts mitteilen.

Die Geräte, die senden sind bekannt. Es sind Geräte zum Programmieren 
einer Forschungsstation. Diese haben ein mit einem Microcontroller 
erstelltes Protokoll. Es gibt glaube ich 4 unterschiedliche Geräte 
unterschiedlicher Forschungsgruppen.

Die Anchaltung der Geräte erfolgt induktiv durch den Boden / die Luft

von Herbert (Gast)


Lesenswert?

Äh falsch, ich wollte sagen, "ob es Parity gibt".

Präambel gibt es in der Weise zwar, aber ich kann sie nicht nutzen, da 
der Inhalt nicht 100% klar ist.

Und ich muss es erkennen.

von Rolf M. (rmagnus)


Lesenswert?

Herbert schrieb:
> Die Daten kommen gepulst, also mit Pausen. Ich kann natürlich ein
> Startbit erkennen. Es ist nur nicht klar, ob es ein Stoppbit gibt.

Wenn es kein Stoppbit gibt, ist es keine normale UART-Kommunikation. Die 
hat immer mindestens ein Stoppbit.

von A. S. (Gast)


Lesenswert?

Warum senden die denn auf verschiedenen baudraten?

Lösung 1: brutal force... Alle möglichen baudraten parallel mit n SIOs. 
Auf der Logikebene kannst Du so viele haben, wie Du möchtest.

Dann ggf nach Präambel alle parallel mit der ermittelten baudraten, 
jedoch in 1% Schritten.


Die praktische Lösung ist aber eine andere, ... Wenn es wirklich 
Forscher waren und nicht alle 
gestorben/teleportiert/eingefroren/wahnsinnig sind, dann fragen, wer da 
was warum tut. Niemand baut sowas damit es nicht funktioniert.

von Kastanie (Gast)


Lesenswert?

seltsame Angaben.
Wie soll das z.B. eindeutig ohne Stopbit funktionieren, wenn die Daten 0 
sind? Insbesondere wenn man nicht weiß ob diesmal ein Stopbit dabei ist 
oder nicht.
Irgendwelche Infos wird es zu diesem Protokoll sicher noch geben.
Ansonsten kannst du nur alle Flanken auswerten und die Zeit zwischen den 
Flanken messen und dies alles in ein Protokoll schreiben.
Die Auswertung dieser einzelnen Zeitstempel kann man dann in aller Ruhe 
danach machen und nach Plausibilität prüfen.

von TI (Gast)


Lesenswert?

Also um das erste Problem anzugehen musst du mittels Abtasttheorem 
(Abtastrate = 2x Senderate(Maximale mögliche Senderate)) alle Daten 
erfassen können, dann verpasst du auch nichts. Diese Daten sollten dann 
gebuffert werden und im Anschluss verarbeitet werden.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wer auch immer sich das ausgedacht hat, hat nicht lange genug gedacht.

von m.n. (Gast)


Lesenswert?

Herbert schrieb:
> Die Daten kommen gepulst, also mit Pausen.

Dann ist die Sache doch ganz einfach. Die Bitfolge mit 460,8 kHz 
abtasten, zwischenspeichern und anschließend auswerten ;-)

von Cyblord -. (cyblord)


Lesenswert?

Kennt man die Bitanzahl kann man den Bitstrom im Nachhinein auswerten. 
Jeder LA hat das Feature "Auto Baudrate" und kann das auch selbst 
erkennen.
Nur "on the fly" wirds etwas knifflig. Was dann auch den Einsatz einer 
dezidierten UART Komponente ausschließt.

von Axel S. (a-za-z0-9)


Lesenswert?

Herbert schrieb:
> Ich soll mit einem Microcontroller eine nicht spezifizierte Datenrate
> einer UART ermitteln und dann Daten empfangen. Bekannt ist, dass das
> anzuschließende Gerät mit 9600 ... 115k senden wird, Parity und
> Stoppbits sind offen.
>
> Problem1: Gerät wird angeschlossen und pulst die Daten raus. Alles muss
> empfangen werden ohne einen Vorlauf auf den man sich einpendeln könnte.

Herbert schrieb:
> Die Daten kommen gepulst, also mit Pausen. Ich kann natürlich ein
> Startbit erkennen. Es ist nur nicht klar, ob es ein Stoppbit gibt. Die
> Daten sind aber ausreichend lang, um  zu erkennen, ob es z.B. 4x8, 4x9
> oder 4x10 Bits sind. Zwischen Stopp und Start gibt es auch eine minimale
> Pause.

Wenn du wirklich nichts weiter weißt und auch nichts verpassen darfst, 
dann bleibt dir nichts übrig als das Telegramm mit hinreichend hoher 
Zeitauflösung über einen hinreichend langen Zeitraum zu samplen. Und 
dann die Daten aus dem Empfangsbuffer intelligent auszuwerten.

Hinreichend schnell: so daß du bei maximaler Baudrate wenigstens zwei 
Samples pro Bitzelle hast, mehr wären besser.

Hinreichend lange: so daß auch das längste denkbare Telegramm bei der 
niedrigsten Baudrate noch komplett aufgezeichnet wird.

Intelligent: die Längen von L- und H-Phasen klassifizieren. Das sollten 
vielfache (1 .. maximal 11) einer kürzesten Zeitdauer sein. Diese 
kürzeste Dauer ist dann die Bitzeit (Kehrwert der Baudrate). Allerdings 
kann man sich problemlos Telegrame ausdenken, die auch bei dieser 
Auswertung in die Irre führen. Störungen kommen noch oben drauf.

von HildeK (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Wer auch immer sich das ausgedacht hat ....

Worauf beziehst du dich? Auf die unbekannte, variable Datenrate oder den 
Abtastvorschlag?
Falls letzteres: ich würde es ähnlich versuchen, aber mit höherer Rate 
als TI (Gast) vorschlug.
Es sollte aber wenigstens bekannt sein, ob mit oder ohne Parity und wie 
lange das Stopbit ist.

von W.S. (Gast)


Lesenswert?

Herbert schrieb:
> Ich soll mit einem Microcontroller eine nicht spezifizierte Datenrate
> einer UART ermitteln und dann Daten empfangen.

Ist doch eigentlich ganz einfach. Jeder serielle Bootlader in den 
heutigen µC - die sowas haben - kann das.

Zuerst wird ohne UART der Zustand des Portpins beobachtet und ab einem 
Flankenwechsel h->l die Länge der low- und high-Zeiten bestimmt. Die 
kürzeste davon ist (mit Ausnahme von eventuellen ganz kurzen 
Störimpulsen) die Zeit für 1 Bit und die anderen Zeiten sind dann so 
etwa ganzzahlige Vielfache davon. Dann hat man die Bitzeit, gemessen in 
Perioden des eigenen Taktes und kann daraus den Baudratenteiler 
bestimmen.

W.S.

von H.Joachim S. (crazyhorse)


Lesenswert?

Herbert schrieb:
> Dem Sender kann ich nichts mitteilen.
>....
> Die Anchaltung der Geräte erfolgt induktiv durch den Boden / die Luft


Irgendwie ist die ganze story nicht schlüssig - dem Sender bleibt also 
eh nichts anderes übrig, als andauernd zu senden. Ob nun jemand zuhört 
oder nicht weiss er ja nicht.

Genausogut könntest du die "Anschaltung" ein Paket später machen und 
hättest damit auch dieses eine verloren. Also kannst du auch ein erstes 
Paket zur Ermittlung der Baudrate nehmen und ab dann korrekt mithören.

von Peter D. (peda)


Lesenswert?

Cyblord -. schrieb:
> Nur "on the fly" wirds etwas knifflig. Was dann auch den Einsatz einer
> dezidierten UART Komponente ausschließt.

Man könnte mit Input-Capture die Timestamps aller Flanken aufzeichnen 
und dann nachträglich auswerten. Ein ATmega328 sollte dafür reichen.

von m.n. (Gast)


Lesenswert?

W.S. schrieb:
> Ist doch eigentlich ganz einfach.

Jetzt mußt Du nur noch mitteilen, wie man die Anzahl der Bits, Parität 
und die Länge des Stoppbits erkennt,
Kann das die Betty? ;-)

von Thomas W. (diddl)


Lesenswert?

Axel S. schrieb:
> Hinreichend schnell: so daß du bei maximaler Baudrate wenigstens zwei
> Samples pro Bitzelle hast, mehr wären besser.

Ist eine Möglichkeit...

... die andere ist, auf die Flanken zu gehen und die Zeit messen.


Bei einem Signal aus einem UART hat man den Vorteil, dass jedes Bit 
immer gleich lange dauert.



Man kann das noch weiter verbessern, wenn man eine schräge Stopbit 
Einstellung vorschreibt.

Zb. Stoppbit Länge 1,5

Dann kann man in der Regel bereits nach dem ersten Byte nach einer Pause 
die Baudrate bestimmen.

====

Der Empfänger hat also zwei Zustände:

- Baudrate erkennen
- Daten lesen



Baudrate erkennen:

UART ausschalten und den IO Pin als normalen Input betreiben.
Oder, wenn möglich, die Flanken auswerten per Interrupt.

Dann die Samples auswerten und die UART Parameter durch Analyse 
erkennen.


Daten lesen:

UART einschalten mit den analysierten Parameter.
Daten lesen ...

Im wiederholten Fehlerfall ggf. auf Baudrate erkennen wechseln.

von Michael U. (amiga)


Lesenswert?

Hallo,

für jede mögliche Baudrate einen UART mit den Eingängen parallel und 
schauen, wo gültige Daten rauskommen. ;)

ich hae hier eine alte Handycam die sendet ihr Bild mit 921kBaud raus. 
Ohne Punkt und Komma, will sagen: Startbit-8 
Datenbits-Stopbit-Startbit-8 Datenbist usw. Da hat man keine Chance 
mittendrin einzusteigen...

Gruß aus Berlin
Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

HildeK schrieb:
> Worauf beziehst du dich? Auf die unbekannte, variable Datenrate oder den
> Abtastvorschlag?

Auf ersteres.

Unbekannte, variable Datenrate, unbekanntes Framing und unbekannter 
Inhalt ohne Präambeln zur Synchronisation oder Erkennung o.ä.

Das ist ein brutalstmöglicher Designfehler.

von Percy N. (vox_bovi)


Lesenswert?

Kannst Du Dich überhaupt darauf verlassen, dass es immer Pakete von 
genau vier Bytes (mit welchem Aufbau auch immer) sind?
Anders herum: Wie stellst Du sicher, dass 4*10 nicht eigentlich 5*8 
bedeuten soll?

von Max D. (max_d)


Lesenswert?

Wenn möglich würde ich einen Laptop mitnehmen da einen 5€ saleae-Klon 
dran und einfach den ganzen Datenstrom in den RAM saugen. Danach hat die 
CPU eine Ewigkeit Zeit jede erdenkliche baud Rate zu testen.
Falls ein Laptop zu sperrig geht vlt auch ein SBC (da ist man halt etwas 
beschränkter im RAM).

Edit: sigrok ist ein guter anfangspunkt für logic-analyzer Nutzung und 
ist per python-skript erweiterbar.

: Bearbeitet durch User
von Uwe K. (ukhl)


Lesenswert?

Herbert schrieb:

> Die Daten kommen gepulst, also mit Pausen. Ich kann natürlich ein
> Startbit erkennen.

Man kann ein Startbit nicht erkennen, wenn das erste Bit eine 0 ist. 
Zumindest nicht die Länge um daraus eine Baudrate abzuleiten.

> Es ist nur nicht klar, ob es ein Stoppbit gibt. Die
> Daten sind aber ausreichend lang, um  zu erkennen, ob es z.B. 4x8, 4x9
> oder 4x10 Bits sind. Zwischen Stopp und Start gibt es auch eine minimale
> Pause.

Die Pause ist auch als Stoppbit bekannt. UART ohne Stoppbit geht nicht.

Die Sender müssen sich schon an eine vorgegebene Spezifikation halten, 
sonst wird das nix.

Man muss mindestens die drei Parameter wissen:
- Baudrate
- Wortlänge
- Parity Ja/Nein

Die Länge des Stoppbits ist für den Empfang nicht wichtig. Muss aber 
selbstverständlich vorhanden sein.

Wenn alle Geräte mit den gleichen Parametern senden aber unbekannt ist, 
kann man das Format meist analysieren und dann im Empfänger einstellen.

Eine automatische Erkennung aller Parameterkombinationen ohne 
Datenverlust ist sicher möglich, aber extrem aufwendig, unzuverlässig 
und teuer.
Es ist wesentlich besser, die Sender in einen genormten Zustand zu 
bringen.

von m.n. (Gast)


Lesenswert?

Uwe K. schrieb:
> Es ist wesentlich besser, die Sender in einen genormten Zustand zu
> bringen.

Und sei es pro Gerät nur ein kleiner µC, der das vorhandene Format 
empfängt und die Daten dann in einem bekannten, festen Format ausgibt.
Das dürfte eine zuverlässige und kostengünstige Lösung sein.

von Jim M. (turboj)


Lesenswert?

Herbert schrieb:
> Ich brauche also eine Format-Rate-Schaltung mit angeschlossener
> Dekodierung.
>
> Wie macht man das am Klügsten?

Viele NXP LPCxxx µCs (z.B. LPC1768) haben Autobauding fürs Hayes 
Protokoll, wie bei alten seriellen Modems.

Das basiert auf dem Timing des "A" oder "a", denn die Kommandos fangen 
alle mit "AT" an.

Allerdings braucht man auch zwingend eine ausreichend lange Pause 
zwischen den Daten, damit der Anfang korrekt erkannt wird.

In meinen Augen gehört der Hardware Designer erschossen der den Quarz 
eingepart hat. Damit wäre die Abweichung deutlich unterhalb von 1%, auch 
über einen weiten Temperarturbereich.

von Elias K. (elik)


Lesenswert?

Jim M. schrieb:
> Viele NXP LPCxxx µCs (z.B. LPC1768) haben Autobauding fürs Hayes
> Protokoll, wie bei alten seriellen Modems.
>
> Das basiert auf dem Timing des "A" oder "a", denn die Kommandos fangen
> alle mit "AT" an.

Damit ist es für den TO ungeeignet, da das erste Zeichen wahrscheinlich 
nicht "A" ist.

Max D. schrieb:
> Wenn möglich würde ich einen Laptop mitnehmen da einen 5€ saleae-Klon
> dran und einfach den ganzen Datenstrom in den RAM saugen.

Abhängig vom Umfang der Daten würde ich über einen Logik-Analyzer mal 
nachdenken. Ein Oversampling von 4 würde ich mindestens machen, 1 MSPS 
und mehr über längere Zeit ist mit den Saleae möglich. Allerdings ist 
das vorher trocken zu üben. Sonst gibts auf dem Feld böse 
Überraschungen!
Eine Dekodierung des UART lässt sich anschließend in der zugehörigen 
Software relativ bequem machen.


Eine Frage: Wie wurden denn die Geräte bisher ausgelesen, wenn es nicht 
gerade du machen musst? Zum Beispiel zum Test bei der Entwicklung, oder 
auch von anderen Operatoren im Feld?

Zweite Frage: Zu welchem Zeitpunkt beginnt das DUT Daten zu senden? 
Sobald es Energie über das induktive Feld bekommt? Werden die Daten 
zurückgesetzt, wenn ich den Vorgang erneut initiiere? (Oder direkt 
gefragt: Musst du zwingend das erste Telegram richtig empfangen, oder 
reicht es irgendein Telegram vollständig zu empfangen?)

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.