Forum: Mikrocontroller und Digitale Elektronik Verschiedene Variablen aus einem Empfangenen String in ein Array speichern


von Simon K. (simon-k)


Lesenswert?

Moin
Ich hab ein Problem.
Momentan versuche ich einen String vom PC über RS232 an meinen kleinen 
Atmega32 zu senden. Das funktioniert auch ohne Probleme nun möchte ich 
den Empfangenen String am µC auswerten und die einzelnen Segmente die 
mit einem Komma getrennt sind in einem Array speichern.
Also mein String sieht ungefähr so aus:
String1,1,1,1,var1,var2,var3,var4
Nun sollen die verschiedenen Variablen in einem Array gespeichert 
werden.
Leider habe ich keine Ahnung wie ich das machen soll. Das ganze wollte 
ich in C programmieren.
Weiß jemand wie man das lösen kann?
Ich bin für jede Hilfe dankbar.
Gruß Simon

von Detlev T. (detlevt)


Lesenswert?

Die Standard-Funktionen, die mir da einfallen, sind sscanf und strtol.

von Simon K. (simon-k)


Lesenswert?

Hi
Hast du vielleicht ein Beispiel dazu?
Ich kenn die Funktionen nicht.
Gruß Simon

von Spinne (Gast)


Lesenswert?

gidf.de

von Matthias L. (Gast)


Lesenswert?

Ich würde das Ganze mit nem Zustandsautomaten und Arrays/Pointern 
machen. Das kann gleich in der Uart-Receive-ISR stattfinden.

von Detlev T. (detlevt)


Lesenswert?

@Simon K.
Die ANSI-C Standardbibliotheken sollte man eigentlich irgendwo 
griffbereit haben. Das erspart viel Arbeit.

http://linux.die.net/man/3/strtol
http://linux.die.net/man/3/sscanf

Es könnte folgendes gehen:
1
int i = 0;
2
char * next = s; /* Eingabestring */
3
while(* next) /* noch kein Stringende */
4
   {
5
     array[i++] = strtol(next, &next, 0);
6
     if (* next) next++; /* Komma überspringen */ 
7
   }

von Simon K. (simon-k)


Lesenswert?

Hi
Ich habe das jetzt mal so versucht wie in dem Beispiel welches du 
gepostet hast, aber irgendwie haut das nicht hin.
Oder hab ich das falsch gemacht?

char Buffer[20];
unsigned char array[10];

uart_gets( Buffer );   // Auf eine Zeile vom Benutzer warten

int i = 0;
char * next = Buffer; /* Eingabestring */

while(* next) /* noch kein Stringende */
   {
     array[i++] = strtol(next, &next, 0);
     if (* next) next++; /* Komma überspringen */
   }


Sorry aber ich bin noch Anfänger.
Danke für die Hilfe.
Gruß Simon

von P. S. (Gast)


Lesenswert?

Simon K. wrote:

> Ich habe das jetzt mal so versucht wie in dem Beispiel welches du
> gepostet hast, aber irgendwie haut das nicht hin.
> Oder hab ich das falsch gemacht?

Wenn du nicht schreibst, was nicht geht, kann dir niemand helfen.

> uart_gets( Buffer );   // Auf eine Zeile vom Benutzer warten

Welcher Kompetenzbolzen hat denn die uart-Bibliothek geschrieben? Wenn 
die Eingabezeile laenger als dein Buffer ist, pinselt dein Programm hier 
schon schoen im Speicher rum. Da gibt's bestimmt noch eine Version mit 
Laengenbegrenzung.

von Simon K. (simon-k)


Lesenswert?

Sorry
Ich habe das so gemacht wie oben beschrieben. Und dann habe ich versucht 
das Array aus zu lesen und dann wenn eine 1 drin steht wollte ich einen 
Port schalten um zu testen ob es funktioniert. Nur da es nicht geklappt 
hat. Habe ich versucht das Array wieder zurück an den Rechner zu Senden. 
Das Senden hat auch geklappt aber da stand nichts drin. Deswegen habe 
ich gedacht der Fehler muss irgendwo in der Verarbeitung liegen.
Gruß Simon

von P. S. (Gast)


Lesenswert?

Dann zeige mal den ganzen Code, der Fehler kann ja nun ueberall liegen. 
Waere natuerlich besser, du wuerdest in kleinen Schritten arbeiten, also 
zum Beispiel erstmal ein einfaches Echo implementieren, damit du dir 
sicher bist, dass du empfangen und senden kannst.

Einfacher geht das ganze natuerlich, wenn du ein Entwicklungssystem mit 
Display hast, dann kannst du wenigstens Debug-Ausgaben machen - die 
Ausgabe auf dem Display natuerlich vorher separat testen ;-)

Und wenn du zum ersten Mal Text parst, machst du das am besten erst mal 
auf dem PC, mit einem Debugger, wo du in Ruhe und Schritt fuer Schritt 
nachpruefen kannst, was dein Programm tut.

von Detlev T. (detlevt)


Lesenswert?

Solche Konvertierungs-Geschichten sollte man erst einmal auf dem PC 
"trocken" testen bevor man es in dem µC flasht. Folgendes Programm 
funktioniert bei mir:
1
#include <stdio.h>
2
#include <string.h>
3
4
int main(void)
5
{
6
int i = 0;
7
char Buffer[] = "1,5,2,3,6,2";
8
char * next = Buffer; /* Eingabestring */
9
int wert; /* Statt Array */
10
11
while(* next) /* noch kein Stringende */
12
   {
13
     wert = strtol(next, &next, 0); i++;
14
     printf("%i:%i\n", i, wert);
15
     if (* next) next++; /* Komma überspringen */
16
   }
17
return 0;
18
}
Gibt aus:
1:1
2:5
3:2
4:3
5:6
6:2

Die Schleife bricht auch ordnungsgemäß ab. Übertragungsfehler dürfen 
hier natürlich nicht passieren, die müsstest du ggf. noch gesondert 
abfangen.

von Simon K. (simon-k)


Lesenswert?

Hi
Ja den Code stell ich Morgen mal rein.
Das senden und empfangen funktioniert super.
Ich habe es in kleinen schritten gemacht zuerst habe ich versucht einen 
String vom µC zum PC zu senden. Und dann habe ich einen String vom PC 
zum µC gesendet. Hat auch alles super funktioniert. Nur das mit dem 
Display klappt momentan leider nicht, mir fehlt die Hardware dafür :-D
Nur ich will nachher 2 µC mit einander kommunizieren lassen und da 
wollte ich alle Daten in einem String zusammenfassen.
Und die verschiedenen Variablen will ich dann wieder in einem Array 
Speichern.
Gruß Simon

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.