www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C: String splitten?


Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abend,

wie kann ich in WinAvr einen String splitten ? Ich habe gelesen, dass 
die Verwendung von "strtok_r()" nicht gut sein soll, das sie einige Bugs 
beinhaltet.

Ich habe einen String der so aussieht:
zahl;zahl

das ganze soll nach ; gesplittet werden....

danke !

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
newbie wrote:
> wie kann ich in WinAvr einen String splitten ? Ich habe gelesen, dass
> die Verwendung von "strtok_r()" nicht gut sein soll, das sie einige Bugs
> beinhaltet.

Da strtok wahrscheinlich wenigstens zweimal so alt ist, wie du, dürften 
mittlerweile alle Fehler beseitigt sein.

Wenn es akzeptabel ist, daß der Quellstring dabei zerstört wird - strtok 
schreibt auf das Trennzeichen eine \0 -, dann kannst du sie ruhig 
nehmen.

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Code sieht so aus:
result = strtok_r( command, delim );
while( result != NULL ) 
{
i=i+1;
if (i=1){richtung = (int)result;}
if (i=2){schritte = (int)result;}
}
uart_putc( (unsigned char)richtung );
uart_putc( (unsigned char)schritte );

bekomm immer eiN Fehler, ein Arugment ist zu wenig, aber ich bekomme das 
nicht hingebacken. Bin noch neu in C.

Danke

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mein Code sieht so aus:

Das kann nicht alles sein. Wo kommt die Fehlermeldung?

Zudem mußt du strtok für jeden Token einmal aufrufen, den du aus dem 
String extrahieren willst.

Autor: newbie (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich sach mal was mir aufm herzen liegt..

ich habe hier eine schrittmotorsteuerung stehen und möchte diesen motor 
per UART steuern:


Schrittmotor ---- Steuerplatine(L297,L298)-----Atmega8+UART--------PC

Ich wollte die Anzahl der Schritte und die Drehrichtung des Motors 
festlegen, da es mit dem Splitten nicht so geklappt hat, habe ich 
erstmal nur ein Zeichen gesendet und zwar eine Zahl, die angibt welche 
Drehrichtung der Motor haben soll. 1 oder 0. Leider dreht sich der Motor 
immer nur in eine richtung....

Ich habe meinen Code in den Anhang gepackt.



Danke !

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist sehr vieles falsch...

Das erste prinzipielle Problem ist, daß du zwar mit

   c = uart_getc();

ein Zeichen vom UART holst, aber eben nur eins - darauf strtok 
loszulassen, macht keinen Sinn.

Ein weiteres Problem ist, daß du vom UART ein Zeichen holst - vermutlich 
eine ASCII-Ziffer und die an motor übergibst. Da motor aber kein 
ASCII-Zeichen, sondern int-Werte erwartet, wird eine (von mir 
korrigierte!) Abfrage

   if (richtung==1)

niemals zutreffen.

Du schreibst

   if (richtung=1)

Das bewirkt, daß richtung der Wert 1 (integer) zugewiesen wird und dann 
geprüft wird, ob richtung einen Wert != 0 enthält, was natürlich der 
Fall ist...

Also: Mach dir den Unterschied zwischen = und == klar!
Ich würde dir empfehlen, als erstes mal das C-Tutorial unter 
http://www.roboternetz.de/wissen/index.php/C-Tutorial durchzuarbeiten, 
daß du die Grundbegriffe lernst.

Wenn du die intus hast, dann kannst du anfangen, mit dem Motor zu 
experimentieren. Wenn du gleich an den Motor gehst, hast du zwei 
Baustellen im Kopf, die sich gegenseitig stören - das frustriert nur.

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Uhu,

das mit dem = und == habe ich mittlerweile auch rausbekommen :). Kannst 
du mir die wichtigen Zeilen ergänzen ? Ich werde mir dieses C Tutorial 
durchlesen, aber ich bin jetzt schon so lange am basteln und würde ein 
kleines erfolgserlebnis haben :)... denn ich habe noch einige andere 
Sachen vor, die ich dann selbstverständlich selbst machen werde.

Wäre nett !

Danke

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, das werde ich nicht tun, denn das Programm ist so mißraten, daß es 
mit ein paar kleinen Korrekturen nicht getan ist - jeder fängt mal klein 
an...

Arbeite das Tutorium durch und spiel mit den Übungsbeispielen rum. Von 
einmal durchlesen lernt man das nicht, wenn man noch nichts darüber 
weiß.

Autor: newbie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja so ein Anfänger bin ich jetzt auch nicht.

Ich habe Jahre mit Visual Basic, Visual Basic.NET und bischen mit C++ 
und C# programmiert. Und ich bin mir durchaus bewusst, dass der 
Parameter der "motor" Funktion vom Typ her nicht mit dem Aufruf Argument 
übereinstimmt. Daher habe ich versucht den Cast Operator zu benutzen, 
nur dieser kann soweit ich weiß, kein String zu einem Integer 
konventieren, ich brauch ein gegenteil von "itoa".

Naja, wenn das Programm mißraten ist, ist es mißraten. Ich werde aber 
dran arbeiten... auch wenn es die ganze Nacht dauert.

Ich danke dir dennoch für deine Mühe und auch für den Link für das 
Tutorial.

Gruß.

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.