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