mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16Bit über RS232


Autor: Uzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marius S. (lupin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Marius S. (lupin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd M. (bernd_m)
Datum:

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

Autor: Uzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Uzer (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.