Forum: Mikrocontroller und Digitale Elektronik 16Bit über RS232


von Uzer (Gast)


Lesenswert?

Hallo,
ich möchte 16-Bit Zahlen über RS232 verschicken und am PC diese Zahlen 
richtig auslesen. Leider klappts nicht. Die Reihenfolge der 8-Bits Parts 
ist nicht immer korrekt. Welche Abhilfe gibt es? Wie kann man es sicher 
realisieren?

von Marius S. (lupin) Benutzerseite


Lesenswert?

Am besten schickst du ein start byte (zB 0x55), dann deine Daten, dann 
eine CRC Prüfsumme. Dann kann eigentlich nix mehr schief gehen. An sich 
sollte es auch gehen wenn du einfach deine beiden Bytes verschickst, die 
kommen immer in der gleichen Reihenfolge in den Buffer.

von Uzer (Gast)


Lesenswert?

ja, das Problem ist beim Auslesen mit MatLab. Wie kann ich wissen, 
welcher Wert gehört zu welcher Variable?

Und wie versendet man einen Startbyte?

von Marius S. (lupin) Benutzerseite


Lesenswert?

Du wartest einfach so lange bis du 2 bytes empfangen hast, daraus baust 
du dir wieder deinen 16 bit wert. So lange du immer 2 bytes sendest und 
auf dem PC wieder einliest müsste das immer passen - problematisch wird 
es wenn der PC fälschlicherweise ein byte einliest.

Das Startbyte würde vom controller verschickt werden und soll dazu 
dienen, das der PC weiss wann eine Datenübertragung beginnt.

von Bernd M. (bernd_m)


Lesenswert?

Ist es eine hi-Byte Lo-Byte Vertauschung (big endian / little endian)?
Welche Proz unterhalten sich miteinander? Hast Du nur 16Bit Werte?

von Uzer (Gast)


Lesenswert?

Ich habe nur 16 Bit werte. Atmega tastet 10 verschiedene Sensoren und 
versendet in je Programmzyklus 10 Werte an den PC (MatLab). MatLab soll 
dann diese 10 Sensorwerte einlesen und verstehen welcher Wert zu welchem 
Sensor passt. Wie kann man das realisieren?
16Bit kann man in 2x8Bit einteilen und verschicken. Da kommt schon das 
Problem welches Byte MatLab als erstes empfängt und wie kann MatLab 
wissen welches Wert zu welchem Sensor passt?

von Karl H. (kbuchegg)


Lesenswert?

Uzer wrote:
> Ich habe nur 16 Bit werte. Atmega tastet 10 verschiedene Sensoren und
> versendet in je Programmzyklus 10 Werte an den PC (MatLab). MatLab soll
> dann diese 10 Sensorwerte einlesen und verstehen welcher Wert zu welchem
> Sensor passt. Wie kann man das realisieren?
> 16Bit kann man in 2x8Bit einteilen und verschicken. Da kommt schon das
> Problem welches Byte MatLab als erstes empfängt und wie kann MatLab
> wissen welches Wert zu welchem Sensor passt?

Gar nicht!

Gegenfrage:
WoherweistdueigentlichimDeutschen,woeinbestimmtesWortanfängtund
woeswiederaufhört.Antwort:DadurchdassdudirspezielleZeicheneinbaust,
imKonkretensinddasLeerzeichenoderSatzzeichen,diedichbeimLesen
leiten.

Falls du das obige nicht lesen kannst, dann hast du genau
dasselbe Problem wie dein Matlab. Der Abschnitt lautet:

Woher weist du eigentlich im Deutschen, wo ein bestimmtes Wort anfängt
und wo es wieder aufhört. Antwort: Dadurch dass du dir spezielle
Zeichen einbaust, im Konkreten sind das Leerzeichen oder Satzzeichen,
die dich beim Lesen leiten.

von Uzer (Gast)


Lesenswert?

Danke für deine Antwort :) Ich verstehe, ich kann ein Leerzeichen 
dazwischen einbauen. Aber das löst das obige Problem trotzdem nicht.

von Karl H. (kbuchegg)


Lesenswert?

Uzer wrote:
> Danke für deine Antwort :) Ich verstehe, ich kann ein Leerzeichen
> dazwischen einbauen. Aber das löst das obige Problem trotzdem nicht.

Wer sagt, dass es immer ein Leerzeichen sein muss?
Alles was du brauchst, ist ein bestimmtes Byte, welches den
Empfänger beim Lesen leitet.

Daher. Frage:
Gibt es einen bestimmten Byte Wert, der in deinen Sensor-Daten
nie vorkommen wird?

Wenn ja: Super! Den kannst du benutzen, damit sich der Empfänger
mit dem Sender synchronisieren kann (Sozusagen ist das der Punkt
am Ende eines Satzes, der dem Empfänger mitteilt: Jetzt beginnt
ein neuer Satz). Das könnte zb sein 2 0xFF Bytes hintereinander.
Wenn der EMpfänger die sieht, weiß er, dass jetzt 20 Bytes
kommen werden, wobei die ersten beiden Bytes vom Sensor 1 sind,
die nächsten beiden vom Sensor 2, etc.

Wenn nein: Schlecht. Dann ist binäre Übertragung nicht so gut
geeignet. Wechsle über auf eien textuelle Übertragung. D.h.
der Sender sendet einen String. Der könnte zb so aussehen

"A0B10C1023D12E8F512G246H78I90J987K"

Und die Bedeutung dieses Strings ist
Sensor 1:  0           Sensor 6: 512
Sensor 2:  10          Sensor 7: 24
Sensor 3:  1023        Sensor 8: 78
Sensor 4:  12          Sensor 8: 90
Sensor 5:  8           Sensor 9: 987

Die Ziffernstrings werden von ihrer Textform wieder auf binär
umgewandelt und können wunderbar weiterverarbeitet werden.

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.