PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Komme nicht weiter bei RP6 Terminalsteuerungsprgramm



Martinius11
18.06.2011, 16:50
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



#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;
}

Martinius11
18.06.2011, 19:19
Hat keiner ne Idee?

RobotMichi
19.06.2011, 13:00
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

Martinius11
19.06.2011, 15:06
Ja da war ein Fehler den zu Beheben hat aber leider nicht geholfen
der Roboter fährt immer noch nicht los

radbruch
19.06.2011, 16:10
Hallo

Ohne weiteren Kommentar zum von dir hingeknallten Quellcode:


#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;
}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....

Viel Erfolg

mic

shedepe
19.06.2011, 16:33
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

Martinius11
20.06.2011, 14:47
So ich will ja nicht als faul geleten. Der Code funktioniert jetzt so weit danke für
die hilfe.



#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;
}

radbruch
20.06.2011, 16:28
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

Martinius11
20.06.2011, 17:03
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

Das sagt mein Informatik Lehrer auch immer.
Aber danke für deine Hilfe