So, prinzipiell klappt die Übertragung jetzt schon sehr gut.
Ich habe nur noch ein großes Problem.
Ich übertrage auf den RP6 Strings die z.B. so aussehen: "#1:160:160:0:*"
Die Eins bezeichnet die Art des Befehls. Hier z.B. die Motorsteuerung. Die beiden "160" und die "0" sind die Parameter für den Befehl. Hier erst die Speedwerte für links und rechts und danach noch die Richtung.
Zum Schluss noch ein "*" um zu signalisieren, dass der Befehl und alle Parameter übertragen sind.
So, nun stehe ich nur vor dem Problem diesen String an den ":" zu zerteilen und in einzelnen Strings oder in einem Array zu speichern.
Ich habe Code dazu, doch leider scheint der ein Memoryleak zu haben, da nach ca. 70 Befehlen der Roboter keine Befehle mehr an nimmt...
Das Programm an sich läuft weiter und auch die Sensordaten werden noch zum PC übertragen.
Ich habe leider keine Ahnung was da schief läuft...
Vielleicht kann ja mal jemand von euch über den Code gucken. Das wäre echt lieb =)
Liebe Grüße,
Fabi
Code:
char text[50];
int counter = 0;
char ** parameter;
char ** strsplit(char sep, size_t max_tokens)
{
free(parameter);
char ** tokens = NULL;
char * str = NULL;
tokens = malloc(sizeof(char *) * (max_tokens + 1));
if(!tokens) goto failed;
size_t size = strlen(text) + 1;
str = malloc(size);
if(!str) goto failed;
memcpy(str, text, size);
tokens[0] = str;
char ** current = &tokens[1];
for(; *str; ++str)
{
if(*str != sep) continue;
if(!--max_tokens) break;
*str = '\0';
*current++ = str + 1;
}
*current++ = NULL;
tokens = realloc(tokens, (char *)current - (char *)tokens);
if(!tokens) goto failed;
return tokens;
failed:
if(tokens) free(tokens);
if(str) free(str);
return NULL;
}
int getCommand(void)
{
if(text[strlen(text)-1] == '*') // Falls das letzte Zeichen das Zeichen für das Befehlsende ist
{
parameter = strsplit(':',10); //Den gesamten Befehl aufsplitten
text[0] = '\0'; //Den Befehl wieder löschen
counter = 0;
return atoi(parameter[0]);//Und das Befehlskommando zurückgeben
}
return 0;
}
#define CMD_SET_SPEED 1
#define CMD_SOUND 2
#define CMD_LEDS 3
#define CMD_LEDS_RP6 4
void task_Commands(void)
{
if(getBufferLength()) //Sind Zeichen im Buffer des seriellen Ports vorhanden?
{
char tmp = readChar(); //Ein Zeichen des Buffers lesen
if (tmp =='#') //Falls ein neuer Befehl gestartet wird
{
mSleep(10); //Warum auch immer man hier warten muss, ohne klappts nicht. Oo
counter = 0; //Laufvariable wieder zurücksetzen, da wir wieder am Anfang des Strings schreiben wollen
text[0] = readChar(); //Noch ein Zeichen aus dem Buffer lesen und als erstes Zeichen des Strings verwenden
}
else
{
text[counter] = tmp; //Falls nicht einfach das ausgelesene Zeichen einfügen
}
text[counter + 1] = '\0';
counter++;
}
int cmd = getCommand(); //Hier wird auch parameter initialisiert...
if(cmd)
{
setCursorPosLCD(0,0);
writeIntegerLCD(cmd,DEC);
switch(cmd)//Schnell was mit den Token machen...
{
case CMD_SET_SPEED: moveAtSpeed(atoi(parameter[1]),atoi(parameter[2])); changeDirection(atoi(parameter[3])); break;
case CMD_SOUND: sound(atoi(parameter[1]),atoi(parameter[2]),0);break;
case CMD_LEDS: setLEDs(atoi(parameter[1]));break;
case CMD_LEDS_RP6: setRP6LEDs(atoi(parameter[1]));break;
}
//Joar, und hier dann wieder irgendwie freigeben...
}
}
task_Command() wird die ganze Zeit aus der Hauptschleife aufgerufen.
Lesezeichen