Forum: Mikrocontroller und Digitale Elektronik String zerlegen


von Peter (Gast)


Lesenswert?

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:
1
char varAmp[10];
2
char varShape[10];
3
char varFreq[10];
4
char Buff [30]= "A3.30ASsSF1000000F";
5
char message [17];
6
7
sscanf(Buff, "A%fAS%1sSF%iF", varAmp, varShape, varFreq); 
8
9
//Ausgabe am Display 1x16 Zeichen
10
sprintf(message, "%s%07dHz%fV", varShape, varFreq, varAmp);
11
lcd_ausgabe(message);

Die Anzeige sieht dann so aus "s536874072HZ0.00"
Wo steck der Fehler?

lg

von Peter (Gast)


Lesenswert?


von Lehrmann M. (ubimbo)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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

von DirkB (Gast)


Lesenswert?

Wenn du %f angibst erwartet scanf auch einen Zeiger auf float und nicht 
auf char. Bei %i einen Zeiger auf int.
1
float varAmp;
2
char varShape[10];
3
int varFreq;
4
char Buff [30]= "A3.30ASsSF1000000F";
5
char message [17];
6
7
sscanf(Buff, "A%fAS%1sSF%iF", &varAmp, varShape, &varFreq); 
8
9
//Ausgabe am Display 1x16 Zeichen
10
sprintf(message, "%s%07dHz%fV", varShape, varFreq, varAmp);
11
lcd_ausgabe(message);

Wobei du varFreq doch besser als (unsigned) long anlegst. den int darf 
auch 16-Bit groß sein.

von Albert .. (albert-k)


Lesenswert?

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:
1
int main()
2
{
3
  float varAmp=0;
4
  char varShape = '0';
5
  int varFreq=0;
6
  char Buff [30]= "A3.30ASsSF1000000F";
7
  char message [17];
8
9
  sscanf(Buff, "A%fAS%cSF%iF", &varAmp, &varShape, &varFreq);
10
11
  printf("Amp: %f\n", varAmp);
12
  printf("Shape: %c\n", varShape);
13
  printf("varFreq: %i\n", varFreq);
14
}

Edit: DirkB war schneller

von DirkB (Gast)


Lesenswert?

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 :-)

von Lehrmann M. (ubimbo)


Lesenswert?

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 =)

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.