Hallo,
mit sscanf(STM32) will ich mehrere Parameter einlesen, das Problem ist
dass er den ersten offensichtlich nicht einliest und der Parameter ist
Null, sollte aber 1 sein. Die nachfolgenden werden problemlos
eingelesen.
Woran kann das liegen?
Vielen Dank, Grüße, Seppel
---------------------------------
Gesendeter String: "PARAM_POS 1 2 33.3"
---------------------------------
Code:
1
uint16_t axis = 0U;
2
uint16_t iter = 0U;
3
float parameter = 0.0;
4
5
#include <string.h>
6
7
if (strncmp((const char *)usbRxBuffer,"PARAM_POS",9)==0U)
Clemens L. schrieb:> %u ist unsigned int.>> Für uint16_t brauchst du so etwas:#include <inttypes.h>> sscanf(&buffer[10], "%"PRIU16" %"PRIU16" %f", &...);
Hallo,
könntest Du bitte den Code vervollständigen und mir erklären warum das
mit uint16_t wie auch uint32_t nicht funktioniert?
Ich denke dass ich nicht der einzige bin der darüber stolpert, da sind
vollständige Posts, mit funktionalem Code und Erklärung sinnvoll. Auch
die innen liegenden Anführungszeichen, was tun die?
Vielen Dank, Grüße Seppel
Bei uint16_t zwar mit Warnung, aber Ergebnis ist korrekt.
da würde ich davon ausgehen das der Inhalt von usbRxBuffer doch nicht so
ist wie gedacht. Was sagt der Debugger? Oder ein printf vom usbRxBuffer?
Clemens L. schrieb:> %u ist unsigned int.>> Für uint16_t brauchst du so etwas:> #include <inttypes.h>> sscanf(&buffer[10], "%"PRIU16" %"PRIU16" %f", &...);
Nicht PRIU16, sondern SCNu16. PRI -> printf-Familie, SCN ->
scanf-Familie. Außerdem würde ich da Leerzeichen drumherum machen. In C
ist das zwar nicht unbedingt nötig, aber in C++ bekommt man ohne eine
Fehlermeldung.
Seppel V. schrieb:> könntest Du bitte den Code vervollständigen und mir erklären warum das> mit uint16_t wie auch uint32_t nicht funktioniert?
Weil die Größe nicht stimmt, zumindset bei uin16_t. %u ist ist für
unsigned int, der auf einem ARM normalerweise 32 Bit ist. Du übergibst
sscanf einen Zeiger auf einen 16-Bit-Wert, aber sscanf versucht
entsprechend deiner Angabe, von dort stattdessen 32 Bit zu lesen, was
natürlich falsch ist.
Für die typedefs aus stdint.h wie uint16_t gibt es entsprechende Makros,
die den richtigen Format-Specifier für den jeweiligen Typen
bereitstellen. Statt also "%u" musst du "%" SCNu16 schreiben, um den
richtigen Format-Specifier für uint16_t in scanf zu bekommen.
Unabhängig vom obigen Size-Problem der Parameter:
Es empfiehlt sich (fast) immer, den Return-Wert von sscanf() zu prüfen.
Hier wird die Anzahl der tatsächlich gefüllten Parameter zurückgegeben.
Diese sollte man als erstes Kriterium für ein erfolgreiches Matching
heranziehen.