2 Bytes tauschen

Gast #4907217
Hallo,

wie kann ich in C 2 Bytes untereinander tauschen?


Der Hintergrund ist das die Funktion eeprom_read_word aus der #include 
<avr/eeprom.h> Bibliothek als Rückgabetyp little endian hat.

Hab sowas versucht aber es wird nur das LSB verschoben...
1
uint64_t uiVal;
2
uiVal =  256* eeprom_read_word(EE_ADR_SERIAL_NUM);

Scheint trivial aber komme da nicht weiter .-(
Gast
Mario schrieb:
> wie kann ich in C 2 Bytes untereinander tauschen?

Das einfachste ist doch wohl
1
uint8_t tmp = a;
2
a = b;
3
b = tmp;


> Der Hintergrund ist das die Funktion eeprom_read_word aus der #include
> <avr/eeprom.h> Bibliothek als Rückgabetyp little endian hat.
er liefert das, was im eeprom drin steht, wenn es dort richtig drin 
steht liefert er es auch richtig. Da muss nicht getauscht werden.
Gast
Peter II schrieb:
> er liefert das, was im eeprom drin steht, wenn es dort richtig drin
> steht liefert er es auch richtig. Da muss nicht getauscht werden.

Im EEPROM steht es in dieser Reihenfolge: 0x 270E

wenn ich es auslese mit eeprom_read_word(EE_ADR_SERIAL_NUM)

wird es zu 0x 0E27 (wird auf dem PC ausgegeben über USB).

Womit könnte es zusammen hängen?
Gast
Mario schrieb:
> so schreibe ich es rein:
> eeprom_write_word(EE_ADR_SERIAL_NUM,  ucRxBuffer[6] | 256 * ucRxBuffer
> [7]);

dann dreht es doch dort gleich richtig.
1
uint16_t tmp = ucRxBuffer[6] << 8 | ucRxBuffer[7];
2
eeprom_write_word(EE_ADR_SERIAL_NUM,  tmp);
Mario schrieb:
> Peter II schrieb:
>> Warum steht es so drin? Wie schreibt du es denn rein?
>
> so schreibe ich es rein:
1
eeprom_write_word(EE_ADR_SERIAL_NUM,  ucRxBuffer[6] | 256 * ucRxBuffer[7]);

Aha. Du schreibst es also anders herum rein, als du es nachher auslesen 
willst. Warum machst du das? Warum schreibst du die Daten - wenn sie 
denn ohnehin in einem byteweisen Buffer vorliegen - überhaupt mit 
eeprom_write_word() statt zweimal eeprom_write_byte()?
Gast
Axel S. schrieb:
> anders herum rein, als du es nachher auslesen
> willst. Warum machst du das? Warum schreibst du die Daten - wenn sie
> denn ohnehin in einem byteweisen Buffer vorliegen - überhaupt mit
> eeprom_write_word() statt zweimal eeprom_write_byte()?

das finde ich eigentlich ok. Wenn ich was als Word auslesen will, würde 
ich es auch als Word reinschreiben. Die Umwandlung vom Protokoll hat 
nichts mit der Speicherung zu tun. Würde ich nicht mal an der gleichen 
stelle machen.
Gast
Peter II schrieb:
> Die Umwandlung vom Protokoll hat nichts mit der Speicherung zu tun.

Offensichtlich wandelst du die beiden Bytes aus dem Protokoll doch 
falsch in Word um, bevor du es ins EEROM schreibst, sonst würde es auch 
richtig wieder raus kommen.
Gast
Wolfgang schrieb:
> Peter II schrieb:
>> Die Umwandlung vom Protokoll hat nichts mit der Speicherung zu tun.
>
> Offensichtlich wandelst du die beiden Bytes aus dem Protokoll doch
> falsch in Word um, bevor du es ins EEROM schreibst, sonst würde es auch
> richtig wieder raus kommen.

ich wandele überhaupt nichts um, ich versuche zu helfen. Bitte darauf 
achten wer was schreibt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.