Sensor Wert in Little Endian

Hallo Leute, ich muss den unsigned int Wert eines Sensors in einen Little Endian umwandeln.

Ausgangspunkt: unsigned int sens = 14527; //Das ist ein Big Endien senshex = 38bf; // In HEX

Gewünschtes Endergebnis: senshexswap = bf38 unsigned int sensswap = 48952; //Das ist ein Little Endien

Ich habe damit begonnen daraus einen String zu generieren diesen dann mit den Funktionen substring und concat zu zerlegen und verdreht wider zusammen zu bauen.

void setup() { Serial.println(); Serial.begin(9600); unsigned int sens = 14527; String senshex = String(sens, HEX); String senshexh = senshex.substring(2, 4); String senshexl = senshex.substring(0, 2); Serial.print("String: "); Serial.println(senshex); Serial.print("H Byte: "); Serial.println(senshexh); Serial.print("L Byte: "); Serial.println(senshexl); String senshexswap = senshexl; senshexswap = senshexh; senshexswap.concat(senshexl); Serial.print("Stringswap: "); Serial.println(senshexswap); } void loop() { }

Jetzt müsste ich nur noch den String senshexswap wider in eine unsigned int umwanden. Das schaffe ich aber nicht! Kann mir bitte jemand Helfen?

Ist das überhaupt der richtige Weg um aus einer unsigned int in Big Endian eine unsigned int mit Little Endian zu generieren. Hat jemand eine bessere/einfachere Idee?

Hilfe!!!!

(deleted)

Man sollte dabei aber nicht vergessen, daß Arduino int's nur 16 Bit haben, also nur 2 Bytes.

Es wäre allerdings einfacher, den Wert gleich beim Einlesen vom Sensor richtig zusammenzusetzen. Werte mit mehr als 1 Byte fallen nicht vom Himmel, sondern kommen byteweise vom Sensor an.

komplizierter als mit strings gehts wohl nicht?

wenn man nicht shiften will:
senshexswap = (sens%256) * 256 +sens/256;
mit shiften: (bitte jemand kontrollieren)
senshexswap = (sens<<8 ) + (sens>>8 );

Wie DrDiettrich gesagt hat: die Zahlen beim Einlesen richtig zusammenstellen.
Grüße Uwe

unsigned int sens = 14527;

void setup() {
  Serial.begin(115200);
  Serial.println(sens, HEX);
  Serial.println(swapBytes(sens), HEX);
}

void loop() {
  // put your main code here, to run repeatedly:

}


uint16_t swapBytes(uint16_t value)
{
  return (value & 0xFF) << 8 | value >> 8;
}

09:54:26.092 → 38BF
09:54:26.092 → BF38

uwefed:
mit shiften: (bitte jemand kontrollieren)
senshexswap = (sens<<8 ) + (sens>>8 );

Durchaus!

Es gibt allerdings auch eine fertige Funktion, welche das erledigt.

void setup() 
{
  Serial.begin(9600);
  Serial.println(__builtin_bswap16(14527),HEX);
  Serial.println(__builtin_bswap16(48952),HEX);
}

void loop() 
{

}

uwefed:
komplizierter als mit strings gehts wohl nicht?

wenn man nicht shiften will:
senshexswap = (sens%256) * 256 +sens/256;
mit shiften: (bitte jemand kontrollieren)
senshexswap = (sens<<8 ) + (sens>>8 );

Wie DrDiettrich gesagt hat: die Zahlen beim Einlesen richtig zusammenstellen.
Grüße Uwe

Super!
Danke, das ist genau die art von Lösung, welche ich gesucht habe!