C: String splitten?

#660292
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.
Gast #660301
Lesenswert?
• ▲
▼
Mein Code sieht so aus:
1
result = strtok_r( command, delim );
2
while( result != NULL ) 
3
{
4
i=i+1;
5
if (i=1){richtung = (int)result;}
6
if (i=2){schritte = (int)result;}
7
}
8
uart_putc( (unsigned char)richtung );
9
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
Gast #660316
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 !
Angehängte Dateien:
#660327
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.
Gast #660341
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
#660346
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ß.
Gast #660350
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.