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)
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?
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.
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.
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.