Hallo Leute,
ich habe ein kleines Problem beim Zerlegen eines Strings:
Von der UART erhalte ich "A3.30ASsSF1000000F".
Diesen String möchte ich nun in einzelne Variablen Aufteilen:
zwischen den beiden großen A steht ein float mit zwei Kommastellen,
zwischen den beiden S ein kleiner Buchstabe und zwischen den beiden F
eine Zahl <=1.000.000.
mit folgendem Code habe ich jetzt mal das "s" richtig in varShape
geschrieben - bei den anderen beieden Werten klappt es noch nicht:
Peter schrieb:> Wo steck der Fehler?
Erzähl doch erstmal was der Fehler ist - ansonsten kann man dir wohl
schlecht helfen. Erzähl mal genau, was schief geht bzw. was angezeigt
wird.
Peter schrieb:> sscanf(Buff, "A%fAS%1sSF%iF", varAmp, varShape, varFreq);
Ersetze mal das %1s durch %c
Sollte dein String immer diese Form haben und nur die entsprechenden
Variablen varAmp, varShape, varFreq sollen ausgelesen werden, so ist es
empfehlenswert bei Mikrocontrollern auf die Verwendung solcher Libraries
zu verzichten, da sie sehr speicher- und rechenintensiv sind.
Stattdessen würde ich in diesem Falle einfach die entsprechenden Chars
einzelenen aus dem empfangenen String herausnehmen und direkt anzeigen,
anstatt groß mit Stringlibraries und Fließkomma zu arbeiten.
Naja, was am Display angezeigt wird habe ich in meinem Beitrag bereits
ganz unten geschrieben.
Ich will ja den String nicht nur ausgeben, sondern die einzelnen
Variablen daraus für mein weiteres Programm verwenden...
lg
Peter schrieb:> sscanf(Buff, "A%fAS%1sSF%iF", varAmp, varShape, varFreq);
Du möchtest varAmp als float abspeichern, aber varAmp ist in deinem
beispiel ein String, dasselbe gilt für varFreq. Korrekt würde es so
aussehen:
Wenn dir sscanf zuviel Speicher verbraucht, kannst du auch strchr() und
strtol() bzw. strtod() nehmen.
Albert ... schrieb:> DirkB war schneller
3 min zählen nicht :-)
DirkB schrieb:> Albert ... schrieb:>> DirkB war schneller> 3 min zählen nicht :-)
Naja bis man das gelesen, erkannt, zusammengeschrieben, Source angepasst
und dem printf nach zu urteilen sogar noch ausprobiert hat, darf das
schon gerne mal 3 Minuten länger dauern =)