Forum: PC-Programmierung Endianess UART unt bit shifting


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Philipp B. (philipp_b993)


Bewertung
0 lesenswert
nicht lesenswert
Hey,
ich habe mal eine Frage zur Endianess und UART. Also mein datenblatt 
(http://www.chafon.com/DownLoadFile.aspx?fid=232) sagt, dass man die 
Bytes mit LSB schicken soll. Was im Grunde einfach nur little endian 
heisst, korrekt? So etwas verwirrt mich der Part mit CRC16. Dort stehen 
zwei Blocke:

LSB-CRC16 (length 1 byte)
CRC16 LSB. CRC-16 checksum, 2 bytes with least significant byte first.

MSB-CRC16 (length 1 byte)
CRC16 MSB.


Mein Ansatz waere einfach CRC16 berechnen und in zwei Bytes aufzuteilen. 
(uint8_t) (crc), (uint8_t) (crc << 8) Und da bin ich mir nicht sicher. 
Muss ich nach rechts oder links verschieben? Ich denke nach Links, weil 
die kleinen Bits ja vorne stehen und die grossen hinten und beim casten 
duerften ja einfach nur die kleinen genommen werden, oder nimmt das 
casten von rechts nach links bits?

Ich nutze uebrings einen STM32F103. Also little endian.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Philipp B. schrieb:
> dass man die
> Bytes mit LSB schicken soll. Was im Grunde einfach nur little endian
> heisst, korrekt?

Nein, dass das 1er bit zuerst kommt, dann das 2er bit, ... bis zum 
128er.  Das ist beim UART aber sowieso Standard. Little Endian betrifft 
die Reihenfolge der Bytes, also ob zuerst das Byte mit 256ern...32768ern 
oder erst das Byte mit 1ern...128ern kommt.

Philipp B. schrieb:
> Muss ich nach rechts oder links verschieben?

Nach rechts. Wenn du nach links Shiftest, werden die unteren 8 Bits zu 
0, und beim Casten kommt dann nur 0 raus.

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Die CRC16 ist ein 16-Bit-Wert.

Wenn Du den z.B. in einer Struktur einfach ans Ende anhängst, dann geht 
es mit dem zugehörigen (Spiegel-)Polynom direkt und einfach und Du 
brauchst Dich nicht um MSByte/LSByte zu kümmern (einfach vom ersten bis 
zum letzten Byte crcen, eintragen, rauschpusten und auf der Gegenseite 
incl. crc crcen).

Oder Du fängst halt an mit drehen und wenden und hast noch ein paar mehr 
Baustellen, wo Du einmal zuviel oder zuwenig drehst.

Um die Bits (LSBit/MSBit) kümmere Dich garnicht, das ist beim UART für 
RS232 (fast) immer gleich, jedenfalls unabhängig von Big/Little-Endian.

: Bearbeitet durch User

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]
  • [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.