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
So er sendet das Signal mit sendCmd() und dann wartet bis er eine Antwort vom PC bekommt. sendCmd() und getCmd() sehen so aus:Code:sendCmd(0x00); while((last_cmd=getCmd())==0); sprintf(text,"CMD: %d",last_cmd); appendLine(text);
Und der Code vom PC sieht 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; }
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 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; }
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; }







Zitieren


Lesezeichen