- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: Komme nicht weiter bei RP6 Terminalsteuerungsprgramm

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661

    Komme nicht weiter bei RP6 Terminalsteuerungsprgramm

    Anzeige

    Powerstation Test
    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;
    }
    MfG Martinius

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    Hat keiner ne Idee?
    MfG Martinius

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    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

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    Ja da war ein Fehler den zu Beheben hat aber leider nicht geholfen
    der Roboter fährt immer noch nicht los
    MfG Martinius

  5. #5
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ohne weiteren Kommentar zum von dir hingeknallten Quellcode:

    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;
    }
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #6
    shedepe
    Gast
    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

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    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;
    }
    MfG Martinius

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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!

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    29
    Beiträge
    661
    Zitat Zitat von radbruch Beitrag anzeigen
    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
    MfG Martinius

Ähnliche Themen

  1. Ich komme einfach nicht weiter :(
    Von Sven1277 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 15.08.2009, 00:32
  2. Ich komme einfach nicht weiter.... :(
    Von Sven1277 im Forum Software, Algorithmen und KI
    Antworten: 3
    Letzter Beitrag: 13.08.2009, 23:10
  3. Ich komme beim Routen nicht weiter :-(
    Von space24 im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 22
    Letzter Beitrag: 22.02.2009, 21:09
  4. Komme nicht weiter-> Welche Akkus?
    Von Delfin im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 28.05.2008, 14:14
  5. ich komme nicht weiter
    Von Heiko.Weber im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 22.10.2006, 15:59

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress