Ich versuche derzeit, Floats über USB zu senden. Der PC weist eine Qt-Anwendung den folgenden Code ausgeführtSTM32 Float über USB vom PC, Endianess kämpfen
float x = 2.0;
memcpy(buffer.data() + 14, &x, sizeof x);
mit der DebugLog Funktion i eindeutig die Serie von Bytes sieht
.. 00 00 00 40 ..
mit der folgenden Reihenfolge, die durch die an dieser Stelle nach
http://www.scadacore.com/field-tools/programming-calculators/online-hex-converter/
wird bei geringer Endianität in 1073741824 umgewandelt.
auf meinem STM32 kann ich den folgenden Code verwenden, um dann einschalten LED4
uint32_t a = buffer[14] | (buffer[15] << 8) | (buffer[16] << 16) | (buffer[17] << 24);
if (a == 1073741824){
HAL_GPIO_WritePin(LED4_PORT, LED4_PIN, GPIO_PIN_RESET);
}
Das Problem entsteht, wenn ich auf die Real float-Wert konvertiert werden soll 2.0
in der Tat, wenn ich tun
float b = buffer[14] | (buffer[15] << 8) | (buffer[16] << 16) | (buffer[17] << 24);
if (b == 2.0f){
HAL_GPIO_WritePin(LED5_PORT, LED5_PIN, GPIO_PIN_RESET);
}
Die LED5 schaltet sich nicht ein.
Ist es ein Endianess-Problem? Wie kann ich den Gleitkommawert 2.0 erhalten?
Grüße,
Senden Sie die Floats als ASCII-Text und konvertieren Sie sie am anderen Ende zurück. Es ist einfach sicherer und einfacher. – ThingyWotsit
"2.0" mit einem abschließenden Zeichen, (CR oder NUL sagen), ist die gleiche Größe wie eine einzige, und kann nicht leicht fehlinterpretiert werden, solange beide Seiten das Protokoll kennen, und dann können Sie fast alles mit allem kommunizieren. Außerdem vermeidet das Protokoll mit dem abschließenden Zeichen die Probleme mit Streaming-Verbindungen, bei denen ein rx-Aufruf "früh" mit weniger Bytes zurückgibt, als für eine vollständige Nachricht/Float benötigt wird. – ThingyWotsit
können Sie ein Beispiel geben? – Luigi