Forum: Mikrocontroller und Digitale Elektronik C: String splitten?


von newbie (Gast)


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 !

von Uhu U. (uhu)


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.

von newbie (Gast)


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

von Uhu U. (uhu)


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.

von newbie (Gast)


Angehängte Dateien:

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 !

von Uhu U. (uhu)


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.

von newbie (Gast)


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

von Uhu U. (uhu)


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ß.

von newbie (Gast)


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ß.

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.