Hat keiner ne Idee?
Hi,
ich wollte mir mal für den RP6 ein TerminalsteuerungsProgramm erstellen
das dann irgentwann ganze Kommandoketten auswertet z.B. 100_FWD_1min_
leider komme ich nicht mehr weiter kann mir jemand sagen wo ein fehler liegen
könnte?
Danke
Code:#include "RP6RobotBaseLib.h" char Buffer[UART_RECEIVE_BUFFER_SIZE + 1]; char Name[12+1]; uint8_t cnt; uint8_t speed = 0; int8_t dir = 0; uint8_t Eingabe(void){ static uint8_t buffer_pos = 0; if(getBufferLength()){ Buffer[buffer_pos]=readChar(); if(Buffer[buffer_pos]=='\n'){ Buffer[buffer_pos] = '\0'; buffer_pos = 0; clearReceptionBuffer(); return 1; } else if(buffer_pos >= UART_RECEIVE_BUFFER_SIZE) { Buffer[buffer_pos] = '\0'; buffer_pos = 0; clearReceptionBuffer(); return 1;} buffer_pos++; } return 0; } void Warten(void){ for(cnt = 0; cnt <UART_RECEIVE_BUFFER_SIZE + 2; cnt++) { Buffer[cnt]=0; } while(!Eingabe()); } void Namenlesen(void){ uint8_t a; for(a=0;a<14;a++){ Name[a]=Buffer[a]; } } void KommandoAuswerten(){ int cnt = 0; int cnt2; int done = 0; char Speed[2]; while(Buffer[cnt]!='/n){ if (Buffer[cnt]=='_'&& done == 0){ for(cnt2=0;cnt2<4;cnt2++){ Speed[cnt2]=Buffer[cnt2]; } speed = atoi(Speed); done = 1; break; } cnt++; } } int main(void){ initRobotBase(); setLEDs(0b000000); writeString("Hallo lass uns starten\n"); writeString("Schreibe mal bitte deinen Namen ins Terminal\n"); Warten(); Namenlesen(); writeString("Dein Name ist also "); writeString(Name); writeChar('.'); writeString("\n"); writeString("Gib mir mal ein Komando"); writeString("\n"); Warten(); KommandoAuswerten(); powerON(); moveAtSpeed(speed,speed); return 0; }
Hallo,
ich hab es mir jetzt nicht genauer durch gelesen, was mir allerdings aufgefallen ist:
die Zeile
while(Buffer[cnt]!='/n){ müsste wohl eher so heißen: while(Buffer[cnt]!='/n'){
Was gibt denn das Programm bzw. der Compiler aus?
lg
Michi
Hallo
Ohne weiteren Kommentar zum von dir hingeknallten Quellcode:
So geht's auch und kann sogar Fehler- und Warnungsfrei kompiliert werden. Was auf den ersten Blick auffällt: Keine Endlosschleife! MoveAtSpeed benötigt das Tasksystem. Mehr mag ich eigentlich noch nicht anmerken. Putze den Code, füge Kommentare ein, simuliere empfangene Daten/Befehle....Code:#include "RP6RobotBaseLib.h" char Buffer[UART_RECEIVE_BUFFER_SIZE + 1]; char Name[12+1]; uint8_t cnt; uint8_t speed = 0; int8_t dir = 0; uint8_t Eingabe(void) { static uint8_t buffer_pos = 0; if(getBufferLength()) { Buffer[buffer_pos]=readChar(); if(Buffer[buffer_pos]=='\n') { Buffer[buffer_pos] = '\0'; buffer_pos = 0; clearReceptionBuffer(); return 1; } else if(buffer_pos >= UART_RECEIVE_BUFFER_SIZE) { Buffer[buffer_pos] = '\0'; buffer_pos = 0; clearReceptionBuffer(); return 1; } buffer_pos++; } return 0; } void Warten(void) { for(cnt = 0; cnt <UART_RECEIVE_BUFFER_SIZE + 2; cnt++) { Buffer[cnt]=0; } while(!Eingabe()); } void Namenlesen(void) { uint8_t a; for(a=0;a<14;a++) { Name[a]=Buffer[a]; } } void KommandoAuswerten(void) { int cnt = 0; int cnt2; int done = 0; char Speed[2]; while(Buffer[cnt] != '\n' ) { if (Buffer[cnt]=='_' && done == 0) { for(cnt2=0;cnt2<4;cnt2++) { Speed[cnt2]=Buffer[cnt2]; } speed = atoi(Speed); done = 1; break; } cnt++; } } int main(void) { initRobotBase(); setLEDs(0b000000); writeString("Hallo lass uns starten\n"); writeString("Schreibe mal bitte deinen Namen ins Terminal\n"); Warten(); Namenlesen(); writeString("Dein Name ist also "); writeString(Name); writeChar('.'); writeString("\n"); writeString("Gib mir mal ein Komando"); writeString("\n"); Warten(); KommandoAuswerten(); powerON(); moveAtSpeed(speed,speed); return 0; }
Viel Erfolg
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Noch eine kleine Anmerkung zu deinem Vorhaben Kommandozeichenketten auszuwerten. Meistens ist es einfacher und effizienter die Daten als Bytes, nach einem bestimmten Schema (z.B. [Startbedingung],[Kommando],[Daten...],[Endbedingung]) zu übertragen
So ich will ja nicht als faul geleten. Der Code funktioniert jetzt so weit danke für
die hilfe.
Code:#include "RP6RobotBaseLib.h" char Buffer[UART_RECEIVE_BUFFER_SIZE + 1]; // Ein Pfufferarry für die entfangenen Zeicehn char Name[12+1]; // Ein Arry für den Namen des Benutzers uint8_t cnt; //Zählvaribale uint8_t speed = 0; // Geschwindigkeitsvariable int8_t dir = 0; // Richtugungsvariable (ändere ich später) void Pruefen(void){ //Prüft wie das neue Komanndo heißst Warten(); //list Recive Buffer aus KommandoAuswerten(); //wertet das Kommando lautet } uint8_t Eingabe(void){ //Hier werden die sich im UART befindenden Zeichen // inden Puffer geladen static uint8_t buffer_pos = 0; if(getBufferLength()) //sinde noch Zeichen einzulesen? { Buffer[buffer_pos]=readChar(); //Zeichen wird eingelesen if(Buffer[buffer_pos]=='\n') //Zeilenumbruch? { Buffer[buffer_pos] = '\0'; //markieren des Endes des Strings buffer_pos = 0; //Puffer Position zurücksetzen clearReceptionBuffer(); //UART Puffer leeren return 1; } else if(buffer_pos >= UART_RECEIVE_BUFFER_SIZE) //falls mal ein Lesefehler ist { Buffer[buffer_pos] = '\0'; buffer_pos = 0; clearReceptionBuffer(); return 1; } buffer_pos++; } return 0; } void Warten(void) { for(cnt = 0; cnt <UART_RECEIVE_BUFFER_SIZE + 2; cnt++) // löscht den Puffer { Buffer[cnt]=0; } while(!Eingabe()); } void Namenlesen(void) //speichert den Namen ab { uint8_t a; for(a=0;a<14;a++) { Name[a]=Buffer[a]; } } void KommandoAuswerten(void) // wertet das Kommando aus ein '_' schliesst einen Befehl ab { int cnt2 = 0; //Zählvariablen int cnt3; int done = 0; // so weis das Program wo es gerade ist char Speed[2]; //String zum zwischen while(Buffer[cnt2] != '\n' || Buffer[cnt2] !='\0') // solange nicht das ende des Strings erreicht { if (Buffer[cnt2]=='_' && done == 0) { for(cnt3=0;cnt3<4;cnt3++) //abspeichern des Geschwindigkeits Teilstrings { Speed[cnt3]=Buffer[cnt3]; } speed = atoi(Speed); //auslesen der Geschwindigkeit done = 1; break; } cnt2++; } done= 0; } int main(void) { initRobotBase(); setLEDs(0b000000); writeString("Hallo lass uns starten\n"); writeString("Schreibe mal bitte deinen Namen ins Terminal\n"); Warten(); Namenlesen(); writeString("Dein Name ist also "); writeString(Name); writeChar('.'); writeString("\n"); writeString("Gib mir mal ein Komando"); writeString("\n"); Pruefen(); while(1){ powerON(); //PowerON task_RP6System(); moveAtSpeed(speed,speed); } return 0; }
Hallo
Schön, dass es schon funktioniert. Und bitte mein oberes Posting nicht falsch verstehen. Aber eine Fehlerbeschreibung ala "leider komme ich nicht mehr weiter, kann mir jemand sagen wo ein fehler liegen könnte?" ist zusammen mit einem unkommentierten und nicht kompilierbarem Quellcode echt eine Zumutung.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen