Hallo,
ich bin ein Anfänger wenn es die Programmierung von Robotern angeht. Wir haben ein Projekt mit dem NIBO2 Roboter, der mit dem NXB2 Modul ausgestattet ist. Auf dem PC läuft die Gegenstation UCOM-XBEE. Mein Problem ist folgendes:
Der NIBO2 fährt autonom und wenn den S3 Schalter gedrückt wird soll er dann in "manuellen" Modus schalten, in diesem Modus sendet er ein Signal an den PC. Problem ist, dass dieses Signal nur manchmal vom PC empfängt wird. Ich denke nicht es liegt am Gerät, weil wir es mit anderen Robotern getestet haben und das gleiche passiert. Hier der Stück Code , der das Signal sendet
Code:
sendCmd(0x00);
while((last_cmd=getCmd())==0);
sprintf(text,"CMD: %d",last_cmd);
appendLine(text);
So er sendet das Signal mit sendCmd() und dann wartet bis er eine Antwort vom PC bekommt. sendCmd() und getCmd() sehen so aus:
Code:
void sendCmd(uint8_t c){
while(uart0_txfull());
UART0_putchar(c);
}
uint8_t getCmd(){
if(!uart0_rxempty()) return UART0_getchar();
return 0;
}
Und der Code vom PC sieht so aus:
Code:
int main(void){
if(!init())
return 1;
while(1){
printf("Waiting for NIBO...\n");
read(fd,buf,1); // auf NIBO2 Signal warten
printf("NIBO is requesting a command\n");
printf("Send a command back to NIBO\n");
scanf(" %d",&ch); // user Eingabe lesen
printf("Char: %d\n",ch);
write(fd,&ch,1); // Eingabe an NIBO2 senden
}
// Before leaving, reset the old serial settings and close the serial port
tcsetattr(fd, TCSANOW, &old_termios);
close(fd);
printf("Serial port closed");
return 0;
}
mit der Methode read() sollte der PC die Signale empfangen ,aber das passiert nur manchmal. Hier die Methode init(): (diese habe ich von einem anderen Projekt genommen, ich weiß nicht was das macht aber denke es ist nötig)
Code:
int init(){
//opens the serial port
fd = open(dev, O_RDWR | O_NOCTTY);
//if the selected serial port is not found
if (fd < 0) {
fprintf(stderr, "error, counldn't open file %s\n", dev);
return 0;
}
//returns an integer that either indicates success or failure of the prot opening
if (tcgetattr(fd, &old_termios) != 0) {
fprintf(stderr, "tcgetattr(fd, &old_termios) failed: %s\n", strerror(errno));
return 0;
}
//configure the serial port -> for more information: http://en.wikibooks.org/wiki/Serial_Programming/termios
memset(&new_termios, 0, sizeof(new_termios));
new_termios.c_iflag = IGNPAR; //ignore parity bit
new_termios.c_oflag = 0;
new_termios.c_cflag = CS8 | CREAD | CLOCAL | HUPCL; //sets the serial port to 8N1
new_termios.c_lflag = 0;
new_termios.c_cc[VINTR] = 0;
new_termios.c_cc[VQUIT] = 0;
new_termios.c_cc[VERASE] = 0;
new_termios.c_cc[VKILL] = 0;
new_termios.c_cc[VEOF] = 4;
new_termios.c_cc[VTIME] = 0;
new_termios.c_cc[VMIN] = 1;
new_termios.c_cc[VSWTC] = 0;
new_termios.c_cc[VSTART] = 0;
new_termios.c_cc[VSTOP] = 0;
new_termios.c_cc[VSUSP] = 0;
new_termios.c_cc[VEOL] = 0;
new_termios.c_cc[VREPRINT] = 0;
new_termios.c_cc[VDISCARD] = 0;
new_termios.c_cc[VWERASE] = 0;
new_termios.c_cc[VLNEXT] = 0;
new_termios.c_cc[VEOL2] = 0;
//sets the input speed of the serial interdace to 9600baud
if (cfsetispeed(&new_termios, B9600) != 0) {
fprintf(stderr, "cfsetispeed(&new_termios, B9600) failed: %s\n", strerror(errno));
return 0;
}
//sets the output speed of the serial interdace to 9600baud
if (cfsetospeed(&new_termios, B9600) != 0) {
fprintf(stderr, "cfsetospeed(&new_termios, B9600) failed: %s\n", strerror(errno));
return 0;
}
//sets the termios struct of the file handle fd from the options defined via the options
if (tcsetattr(fd, TCSANOW, &new_termios) != 0) {
fprintf(stderr, "tcsetattr(fd, TCSANOW, &new_termios) failed: %s\n", strerror(errno));
return 0;
}
return 1;
}
Lesezeichen