Forum: Compiler & IDEs Debian 4.7.2 AVR-GCC sscanf Problem


von Kai L. (klaute) Benutzerseite


Lesenswert?

Hallo,

ich verwende auf meinem Debian-System (64bit) den avr-gcc um meine 
Software für meine Mikrocontroller zu kompilieren.

In meiner Software ist ein TTY per USB implementiert in dem ich 
Benutzereingaben an die MCU senden kann.

Die empfangenen Daten werden per sscanf verarbeitet.

Mit dem aktuellen Atmel Studio und der dazugehörigen AVR GCC Toolchain 
funktioniert dies.

Mit dem standard Paket in Debian gibt es folgendes Problem.

Beispiel 1 (Pseudocode):

char* in_str = "0x02";
unsigned int in = 0;
sscanf(in_str, "0x%02x", &in);

Liefert den korrekt geparsten Wert in der Variablen: in=2.

Beispiel 2 (Pseudocode):

char* in_str = "0x02 0x14";
unsigned int in1 = 0;
unsigned int in2 = 0;
sscanf(in_str, "0x%02x 0x%02x", &in1, &in2);

Liefert keinen Wert wenn die Software auf dem Debian-System kompiliert 
wurde: in1=0 in2=0.

Es ist auf meinem Linux-System die folgende Software installiert:
AVR-GCC: 4.7.2
Lib AVR: 1.8.0
AVR binutils: 2.20.1

Hat hier jemand eine Idee wo das Problem beim Debian 4.7.2 AVR-GCC sein 
könnte?

Meine Linker-Optionen:
-Wl,-u,vfscanf -lscanf_flt -Wl,-u,vfscanf -lscanf_min (abgetippt, kann 
Tippfehler enthalten)

Danke!

von (prx) A. K. (prx)


Lesenswert?

%x ist für unsigned int, nicht für unsigned char.

GCC weiss das übrigens und warnt. Also hast du entweder Warnungen 
ignoriert, oder dein Pseudocode ist zu viel Pseudo.

von Kai L. (klaute) Benutzerseite


Lesenswert?

Richtig, es war zu viel Pseudo.

Ich habe es oben korrigiert...

Danke für den Hinweis!

von A. H. (ah8)


Lesenswert?

Ist das Problem nun gelöst?

Wenn nicht würde ich es erst einmal mit

1
sscanf(in_str, "0x%2x 0x%2x", &in1, &in2);

probieren, denn die Null macht an der Stelle meiner Meinung nach keinen 
Sinn. Wenn das nicht hilft:

1
char* in_str = "02 0x14";
2
sscanf(in_str, "%2x 0x%02x", &in1, &in2);

Auch ein Blick auf Rückgabewert und Fehlercode könnte nicht schaden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Kai Lauterbach schrieb:
> -Wl,-u,vfscanf -lscanf_flt -Wl,-u,vfscanf -lscanf_min

Das ist übrigens nicht sinnvoll.  Entweder willst du die voll
aufgeblähte Gleitkomma-Version aus libscanf_flt.a haben oder die
minimale aus libscanf_min.a, aber nicht beide (bekommst du ohnehin
nicht, die Gleitkommaversion würde in dieser Konstellation „gewinnen“).

Vermutlich brauchst du beide Varianten aber gar nicht, sondern die
Standarversion würde dir völlig genügen.

von Kai L. (klaute) Benutzerseite


Lesenswert?

Ich habe alle Eingaben auf
1
0x%2x
 umgestellt, jedes fälschliche
1
unsigned char
 zu
1
unsigned int
 gewandelt und die Linker-Flags vom
1
scanf_flt
 befreit.

Nun funktioniert es einwandfrei!

Vielen Dank für die schnelle und kompetente Hilfe!!!

Kai

von A. H. (ah8)


Lesenswert?

Hast Du das auch mal nacheinader getan damit mir wissen, woran es lag? 
(Mit Rückgabewert und Fehlernummer?) Ich tippe ja auf das unsigned 
char, damit bin ich dem Fehler am nächsten gekommen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. H. schrieb:
> Ich tippe ja auf das unsigned char, damit bin ich dem Fehler am
> nächsten gekommen.

Glaub' ich nicht, denn die Datentypen, in die er wandeln lassen wollte
(so das Abgebildete der Realitiät entspricht), waren allesamt unsinged
int.  Die chars hat er oben nur für die Strings benutzt.

von (prx) A. K. (prx)


Lesenswert?

Jörg Wunsch schrieb:
> Glaub' ich nicht, denn die Datentypen, in die er wandeln lassen wollte
> (so das Abgebildete der Realitiät entspricht), waren allesamt unsinged
> int.  Die chars hat er oben nur für die Strings benutzt.

In der ursprünglichen Version des Startbeitrags waren das "unsigned 
char" Variablen. Erst auf meinen Hinweis hin hat er den Beitrag 
geändert.

PS: Nützlich zu wissen, dass euch Mods die Versionshistorie eines 
Beitrags zumindest nicht offen ins Auge sticht. ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A. K. schrieb:
> In der ursprünglichen Version des Startbeitrags waren das "unsigned
> char" Variablen.

OK.  "unsigned char" und scanf() ist natürlich immer ein "don't do 
this".

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.