- LiFePO4 Speicher Test         
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

    Praxistest und DIY Projekte
    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
  •  

LiTime Speicher und Akkus