Forum: Mikrocontroller und Digitale Elektronik Datenübertragung über RS232


von Klaus S. (skibby)


Lesenswert?

Hallo allerseits,

ich habe eine Mikrocontrolleranwendung (STM32), die 2 ADC-Kanäle 
ausliest und jeweils 4096 Werte pro Kanal in einem Array speichert.
Momentan übertrage ich die Werte als Strings mit Leerzeichen als Trenner 
per RS232 an den PC (460800 Bit/s). Das klappt auch einwandfrei.
Meine Frage ist, wie ich die Daten platzsparender und damit auch 
schneller übertragen kann ? Ist USB eine sinnvolle Alternative ? (Die 
Möglichkeit dazu wäre vorhanden).

Viele Grüße ,
Klaus SKibowski

von rtfm (Gast)


Lesenswert?

Frage: Warum brauchst Du Trenner ?
Überträgst Du die Daten im ASCC-Format ?
Wenn ja, stelle das um auf normale Binärdaten und die Übertragung ist 
wesentlich kürzer und schneller.

von Klaus S. (skibby)


Lesenswert?

Den Trenner brauch ich, damit das PC-Programm die Werte voneinander 
unterscheiden kann.
Wie kann ich Binärdaten übertragen ? Und wie fiesel ich die am PC wieder
zusammen ? Hast Du mir Quellen wo ich das nachlesen kann ?
Ich habe bisher mit RS232 nur ASCII-Daten übertragen ...

von Justus S. (jussa)


Lesenswert?

Klaus Skibowski schrieb:
> Den Trenner brauch ich, damit das PC-Programm die Werte voneinander
> unterscheiden kann.
> Wie kann ich Binärdaten übertragen ? Und wie fiesel ich die am PC wieder
> zusammen ?

Ich schätze mal, dass deine Werte max. 16 Bit haben werden. Wenn du die 
einfach so überträgst, muss dein PC-Programm einfach immer 2 Bytes als 
einen Wert zusammenfassen...

von Karl H. (kbuchegg)


Lesenswert?

Klaus Skibowski schrieb:
> Den Trenner brauch ich, damit das PC-Programm die Werte voneinander
> unterscheiden kann.
> Wie kann ich Binärdaten übertragen ? Und wie fiesel ich die am PC wieder
> zusammen ? Hast Du mir Quellen wo ich das nachlesen kann ?
> Ich habe bisher mit RS232 nur ASCII-Daten übertragen ...

ASCII sind auch nur Bytes mit Zahlenwerten.
Deine uint16_t sind auch nur Zahlen, wobei allerdings jede Zahl aus 2 
Bytes besteht.

Wenn du also jede einzelne Zahl in 2 Bytes zerlegst, kannst du beide 
nacheinander auf die Reise schicken.

Alelrdings hast du wieder das Problem: Woher weiß ich welches Byte 
welches ist :-)
Du musst dir daher einen Synchronisiermechanismus einfallen lassen (das 
kann zb auch sein: Der PC sendet an den µC das Kommando "Daten marsch" 
und der µC fängt an die Werte nacheinander, High-Byte / Low-Byte 
rauszuspielen. Da der PC weiß, dass immer 2 Bytes ankommen, die 
Reihenfolge kennt und auch weiß wieviele Daten da kommen, kann er die 
einzelnen Bytes wieder richtig zusammensetzen.

von Klaus S. (skibby)


Lesenswert?

Vielen Dank,
warum bin ich da nicht selber draufgekommen ?
Manchmal sieht man den Wald vor lauter Bäumen nicht :-)

von Karl H. (kbuchegg)


Lesenswert?

Aufpassen muss man eigentlich lediglich auf PC-Seite, dass man dort den 
Treiberschichten auch mitteilt, dass sie gefälligst alle Bytes so 
weiterreichen sollen, wie sie sie empfangen haben. Das kann auf manchen 
Betriebssystemen ein Problem sein, muss aber nicht.
Auf µC-Seite ist das sowieso kein Problem. Dort hat man überlicherweise 
kein Betriebssystem mit dem man sich rumstreiten muss, wie jetzt die 
UART bedient wird.

von Helmut L. (helmi1)


Lesenswert?

>Wie kann ich Binärdaten übertragen ?

Im Prinzip genauso wie ASCII Daten

>Und wie fiesel ich die am PC wieder
>zusammen ? Hast Du mir Quellen wo ich das nachlesen kann ?
>Ich habe bisher mit RS232 nur ASCII-Daten übertragen ...

Man kann sich ein Format ueberlegen das eine platzsparendere Art der 
Datenuebertragung macht ohne auf eventuelle Trenner verzichten zu 
muessen.

z.B.

Uebertragung einer 16Bit Integer:

man kann die rein binaer uebertragung in 2 Byte hat dann allerdings 
keine Codes mehr frei fuer eventuelle Trenner.

Rein in ASCII kaemmst du auf 5-6 Zeichen (mit oder ohne Vorzeichen).

Du kannst aber auch etwas dazwischen machen.

z.B. so:

00xxxxxx     erste 6 Bit der Integer
01yyyyyy     zweite 6 Bit Integer
10zzzzzz     dritten 4 Bit der Integer
11mmmmmm     6 Bit fuer zusatzcodes etc.

So hast du Uebertragungszeit gespart und troztdem kannst du Trenner oder 
andere Codes mituebertragen.

Solche Verschachtelten Codes wurden frueher von einigigen 
Druckerherstellern (Canon Laserprinter) eingesetzt um die Uebertragung 
zu beschleunigen und trotzdem ein scannbares Format zu haben.

Du koenntes sowas aehnliches fuer deine Daten dir ausdenken.


Gruss Helmi

von Klaus S. (skibby)


Lesenswert?

Danke an alle,

da ich momentan nur 16-bit Werte übertrage werde ich die Methode von
Karl-Heinz implementieren.

Nur mal so: Hat jemand mal eine Datenübetragung über USB realisiert ?

Gruß, Klaus

von Falk B. (falk)


Lesenswert?

@Klaus Skibowski (skibby)

>Nur mal so: Hat jemand mal eine Datenübetragung über USB realisiert ?

Das haben schon tausende. Wobei man aber unterscheiden muss zwischen 
echtem USB und RS232 Emulation über USB mit FT232 & Co. Letztere sind 
deutlich einfacher zu handhaben, erstere sind schneller.

MfG
Falk

von Klaus S. (skibby)


Lesenswert?

Und wo setzt man bei USB am besten an ?
Wo gibt es gute Doku ?

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.