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
Hi,
ich weiß, es gibt schon viele Threads zu diesem Thema, trotzdem hab ich per Suchfunktion nicht das gefunden, was ich brauche.
Folgender Programmcode:
Allerdings gibt es da einen Fehler beim Compilieren:Code:#include "RP6RobotBaseLib.h" int main(void) { initRobotBase(); char x; while(1) { x = readChar(); } return 0; }
Weiß jemand warum das nich funktioniert, bzw. was ich ändern muss?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
lg
Michi
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
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
Bist du sicher?Außerdem wird die Funktion readChar nicht verwendet.
Such mal die Zeile: receiveBuffer[buffer_pos] = readChar();
Gruß Dirk
Hi,
Upps hab nicht erkannt, dass das das selbe ist.
hab es jetzt foldendermaßen gelöst:
, aber wie kann ich mehr als nur ein Zeichen empfangen? das hab ich aus dem Beispielprogramm nicht herauslesen können.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; }
lg
Zeichen z.B. in einer For-Schleife empfangen und in receiveBuffer[buffer_pos] ablegen. buffer_pos bei jedem Durchlauf inkrementieren.wie kann ich mehr als nur ein Zeichen empfangen?
Wenn alle Zeichen empfangen sind: auswerten.
Gruß Dirk
Hallo Dirk
jetzt sieht es so aus:
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?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; }
lg
Michi
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:
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); } } }
dann geht gar nichts mehr. Es lässt sich zwar compilieren, aber er reagiert auf keinerlei Eingaben.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); } } }
Hat jemand einen Tipp?
lg Michi
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:
und dann z.B. so verwendenCode: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; }
MfG,Code:if(getInputLine()) { if(strcmp(receiveBuffer,"Hallo")==0) { ...
SlyD
Hallo,
ich habe nun auf die Lösung von SlyD zurückgegriffen und das Programm wie folgt gestaltet:
Allerdings mag das der Compiler nicht: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; }
Er hat also was gegen getBufferLength und readChar.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
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
Lesezeichen