www.mikrocontroller.net

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


Autor: Simon K. (simon-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Standard-Funktionen, die mir da einfallen, sind sscanf und strtol.

Autor: Simon K. (simon-k)
Datum:

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

Autor: Spinne (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gidf.de

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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:
int i = 0;
char * next = s; /* Eingabestring */
while(* next) /* noch kein Stringende */
   {
     array[i++] = strtol(next, &next, 0);
     if (* next) next++; /* Komma überspringen */ 
   }

Autor: Simon K. (simon-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Detlev T. (detlevt)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <stdio.h>
#include <string.h>

int main(void)
{
int i = 0;
char Buffer[] = "1,5,2,3,6,2";
char * next = Buffer; /* Eingabestring */
int wert; /* Statt Array */

while(* next) /* noch kein Stringende */
   {
     wert = strtol(next, &next, 0); i++;
     printf("%i:%i\n", i, wert);
     if (* next) next++; /* Komma überspringen */
   }
return 0;
}

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.

Autor: Simon K. (simon-k)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.