- 3D-Druck Einstieg und Tipps         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 29

Thema: readChar richtig verwenden

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175

    readChar richtig verwenden

    Anzeige

    E-Bike
    Hi,

    ich weiß, es gibt schon viele Threads zu diesem Thema, trotzdem hab ich per Suchfunktion nicht das gefunden, was ich brauche.
    Folgender Programmcode:
    Code:
    #include "RP6RobotBaseLib.h"
    
    int main(void)
     {
      initRobotBase();
      char x;
      
      while(1)
       {
        x = readChar();
       }
      return 0;
     }
    Allerdings gibt es da einen Fehler beim Compilieren:

    Code:
    > "E:\RP6\Programme\Eigene Programme\Einlesen\\make_all.bat" 
    
    E:\RP6\Programme\Eigene Programme\Einlesen>set LANG=C 
    
    E:\RP6\Programme\Eigene Programme\Einlesen>make all 
    
    -------- begin --------
    avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Linking: Einlesen.elf
    avr-gcc -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Einlesen.o -I../RP6lib -I../RP6lib/RP6base -I../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/Einlesen.elf.d Einlesen.o ../RP6lib/RP6base/RP6RobotBaseLib.o ../RP6lib/RP6common/RP6uart.o --output Einlesen.elf -Wl,-Map=Einlesen.map,--cref    -lm
    Einlesen.o: In function `main':
    E:\RP6\Programme\Eigene Programme\Einlesen/Einlesen.c:10: undefined reference to `readChar'
    make: *** [Einlesen.elf] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:01
    Weiß jemand warum das nich funktioniert, bzw. was ich ändern muss?

    lg
    Michi

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Michi,

    sieh dir mal das Beispiel Example_02_UART_02 an. Da wird gezeigt, wie man Zeichen mit der RP6Lib einlesen kann.

    Gruß Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    Hallo Dirk,
    ich glaube aber dass in diesem Beispielprogramm ein Fehler ist - auf jeden Fall muss ich die Antwort eingeben, bevor die Frage gestellt wird. Außerdem wird die Funktion readChar nicht verwendet. Trotzdem danke.
    Hat jemand eine andere Lösung?

    Gruß Michi

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Außerdem wird die Funktion readChar nicht verwendet.
    Bist du sicher?

    Such mal die Zeile: receiveBuffer[buffer_pos] = readChar();


    Gruß Dirk

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    Hi,
    Upps hab nicht erkannt, dass das das selbe ist.

    hab es jetzt foldendermaßen gelöst:

    Code:
    #include "RP6RobotBaseLib.h"
    
    void Einlesen(void)
     {
      char receiveBuffer[1];
      receiveBytes(1);
      waitUntilReceptionComplete();
      copyReceivedBytesToBuffer(&receiveBuffer[0]);
      if(receiveBuffer[0] == 'E')
       setLEDs(0b111111);
      if(receiveBuffer[0] == 'A')
       setLEDs(0b000000);
     }
    
    int main(void)
     {
      initRobotBase();
      
     
      
      while(1)
       {
        Einlesen();
       }
      return 0;
     }
    , aber wie kann ich mehr als nur ein Zeichen empfangen? das hab ich aus dem Beispielprogramm nicht herauslesen können.

    lg

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    wie kann ich mehr als nur ein Zeichen empfangen?
    Zeichen z.B. in einer For-Schleife empfangen und in receiveBuffer[buffer_pos] ablegen. buffer_pos bei jedem Durchlauf inkrementieren.

    Wenn alle Zeichen empfangen sind: auswerten.

    Gruß Dirk

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    Hallo Dirk

    jetzt sieht es so aus:

    Code:
    #include "RP6RobotBaseLib.h"
    
    void Einlesen(void)
     {
      int x;
      
      for(x = 0; x < 5; x++)
       {
        char receiveBuffer[x];
        receiveBytes(x);
        waitUntilReceptionComplete();
        copyReceivedBytesToBuffer(&receiveBuffer[0]);
        writeChar(receiveBuffer[0]);
       }
      
     }
    
    int main(void)
     {
      initRobotBase();
      
     
      
      while(1)
       {
        Einlesen();
       }
      return 0;
     }
    Aber der RP6 gibt - wenn überhaupt - nur sinnloses Zeug aus. Ist die for-schleife falsch? wenn ja, wie kann ich sie richtigstellen? wenn nein, was ist sonst falsch?

    lg
    Michi

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    Hi,
    ich hab jetzt per Suchfunktion doch noch was gefunden:

    https://www.roboternetz.de/phpBB2/ze...ag.php?t=48027

    und hab jetzt folgenden Code:

    Code:
    #include "RP6RobotBaseLib.h" 
    
    int main(void) 
    { 
       initRobotBase(); 
       powerON(); 
       char receiveBuffer[5]; 
       while(true) 
       { 
          receiveBytes(5); 
          waitUntilReceptionComplete(); 
          copyReceivedBytesToBuffer(&receiveBuffer[0]); 
          if(strcmp(receiveBuffer,"Hello")) 
          { 
             setLEDs(0b111111);
          } 
       } 
    }
    Das funktioniert ganz gut. aber wenn ich es so mache:

    Code:
    #include "RP6RobotBaseLib.h" 
    
    int main(void) 
    { 
       initRobotBase(); 
       powerON(); 
       char receiveBuffer[5]; 
       while(true) 
       { 
          receiveBytes(5); 
          waitUntilReceptionComplete(); 
          copyReceivedBytesToBuffer(&receiveBuffer[0]); 
          if(strcmp(receiveBuffer,"Hello")) 
          { 
             setLEDs(0b111111);
          }
    	 if(strcmp(receiveBuffer,"HiRP6"))
          {
             setLEDs(0b000000);
    	  } 
    	
       } 
    }
    dann geht gar nichts mehr. Es lässt sich zwar compilieren, aber er reagiert auf keinerlei Eingaben.

    Hat jemand einen Tipp?

    lg Michi

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    http://www.cplusplus.com/reference/c...string/strcmp/

    --> if(strcmp(receiveBuffer,"Hello") == 0)
    ...
    else if ...

    Und drauf achten das auch noch \n (newline) mitgesendet werden kann... besser wie im Beispiel immer eine komplette Zeile einlesen.

    z.B. mit dieser Funktion hier:

    Code:
    char receiveBuffer[UART_RECEIVE_BUFFER_SIZE+1];
    
    uint8_t getInputLine(void)
    { 
    	static uint8_t buffer_pos = 0;
    	if(getBufferLength()) 
    	{							
    		receiveBuffer[buffer_pos] = readChar();
    		if(receiveBuffer[buffer_pos]=='\n')
    		{
    			receiveBuffer[buffer_pos]='\0'; 
    			buffer_pos = 0;
    			return 1;
    		}
    		else if(buffer_pos >= 32)
    		{									
    			receiveBuffer[32]='\0';	
    			buffer_pos = 0;
    			return 2;
    		}
    		buffer_pos++;
    	}
    	return 0;
    }
    und dann z.B. so verwenden

    Code:
    if(getInputLine())
    {
    		if(strcmp(receiveBuffer,"Hallo")==0)
    		{
    			   ...
    MfG,
    SlyD

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    28.04.2009
    Ort
    Wörgl
    Alter
    28
    Beiträge
    175
    Hallo,

    ich habe nun auf die Lösung von SlyD zurückgegriffen und das Programm wie folgt gestaltet:

    Code:
    #include "RP6RobotBaseLib.h"
    
    char receiveBuffer[UART_RECEIVE_BUFFER_SIZE+1]; 
    
    uint8_t getInputLine(void) 
    { 
       static uint8_t buffer_pos = 0; 
       if(getBufferLength()) 
       {                      
          receiveBuffer[buffer_pos] = readChar(); 
          if(receiveBuffer[buffer_pos]=='\n') 
          { 
             receiveBuffer[buffer_pos]='\0'; 
             buffer_pos = 0; 
             return 1; 
          } 
          else if(buffer_pos >= 32) 
          {                            
             receiveBuffer[32]='\0';    
             buffer_pos = 0; 
             return 2; 
          } 
          buffer_pos++; 
       } 
       return 0; 
    } 
    
    int main(void)
     {
      initRobotBase();
      powerON();
      
      while(1)
       {
        if(getInputLine())
    	 {
    	  if(strcmp(receiveBuffer, "Ein")==0)
    	   {
    	    setLEDs(0b111111);
    	   }
    	  if(strcmp(receiveBuffer, "Aus")==0)
    	   {
    	    setLEDs(0b000000);
    	   }
    	 }
       }
       
       return 0;
     }
    Allerdings mag das der Compiler nicht:

    Code:
    > "E:\RP6\Programme\Eigene Programme\Einlesen2\\make_all.bat" 
    
    E:\RP6\Programme\Eigene Programme\Einlesen2>set LANG=C 
    
    E:\RP6\Programme\Eigene Programme\Einlesen2>make all 
    
    -------- begin --------
    avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    
    Compiling: Einlesen2.c
    avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Einlesen2.lst -I../RP6lib -I../RP6lib/RP6base -I../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/Einlesen2.o.d Einlesen2.c -o Einlesen2.o
    Einlesen2.c: In function 'getInputLine':
    Einlesen2.c:8: warning: implicit declaration of function 'getBufferLength'
    Einlesen2.c:10: warning: implicit declaration of function 'readChar'
    
    Linking: Einlesen2.elf
    avr-gcc -mmcu=atmega32 -I. -gdwarf-2   -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=Einlesen2.o -I../RP6lib -I../RP6lib/RP6base -I../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/Einlesen2.elf.d Einlesen2.o ../RP6lib/RP6base/RP6RobotBaseLib.o ../RP6lib/RP6common/RP6uart.o --output Einlesen2.elf -Wl,-Map=Einlesen2.map,--cref    -lm
    Einlesen2.o: In function `getInputLine':
    E:\RP6\Programme\Eigene Programme\Einlesen2/Einlesen2.c:8: undefined reference to `getBufferLength'
    E:\RP6\Programme\Eigene Programme\Einlesen2/Einlesen2.c:10: undefined reference to `readChar'
    make: *** [Einlesen2.elf] Error 1
    Er hat also was gegen getBufferLength und readChar.


    Was bezwecken eigentlich return 1 und return 2??

    Ich würde mich wirklich freuen, wenn ich die "Aufgabe", den RP6 auf Tastatureingaben reagieren zu lassen bald erfolgreich abschließen könnte.

    Gruß
    Michi

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen