String zerlegen

Gast #2158186
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
#2158206
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.
Gast #2158208
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
Gast #2158228
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.
#2158233
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren