我有2个Adafruit XBee 2模块,每个模块都通过一个USB集线器与1根FTDI电缆(ttyUSB0和ttyUSB1)连接到树莓派。 我将两个XBee模块独立configuration在同一个PAN上,然后尝试在一个while循环中读一个,然后在另一个while循环中写一个简单的消息。 出于某种原因,我从来没有从第二个港口读任何东西。
这是我正在使用的testing代码。
configuration:
xbee::xbee(char* usbPort) { /* -> AT (check if xbee modem is responding) <- OK -> ATID (get current PAN) <- 3332 (default, or something else) -> ATID 3137 (set new id) <- OK -> ATID (check again) <- 3137 -> ATWR (write the change to flash) <- OK */ // Sleep for a little bit QWaitCondition waitCondition; QMutex mutex; // Get a util object Linuxutils util; // Open a serial port qDebug() << "Opening Serial Port:" << QString(usbPort); char port[] = "ttyUSB1"; int fd = util.openSerialPort(port); qDebug() << "Done opening Serial Port " << QString(usbPort) << ": " << fd; int didConfigurePort = util.configureSerialPort(fd,9600); qDebug() << "Did configure port successfully? " << didConfigurePort; // Receive buffer char rxBuffer[24]; ///////////////////////////////////////////////////////////////////////////// // Config Mode memset(rxBuffer, 0, sizeof(rxBuffer)); char *msg = "+++"; qDebug() << "Writing config string to XBee ( +++ )"; util.writeToSerialPort(fd,msg); qDebug() << "XBee written to, waiting for response of 'OK'"; while (true) { int readNumberOfBytes = util.readFromSerialPort(fd,rxBuffer,4096); printf("Received ( %d bytes ): %s\n", readNumberOfBytes,rxBuffer); break; } ///////////////////////////////////////////////////////////////////////////// // AT (check if xbee modem is responding) memset(rxBuffer, 0, sizeof(rxBuffer)); char *msg2 = "AT\n"; qDebug() << "Check if XBee is responding ( AT )"; util.writeToSerialPort(fd,msg2); qDebug() << "XBee written to, waiting for response of 'OK'"; while (true) { int readNumberOfBytes = util.readFromSerialPort(fd,rxBuffer,4096); printf("Received ( %d bytes ): %s\n", readNumberOfBytes,rxBuffer); break; } ///////////////////////////////////////////////////////////////////////////// // AT (get current PAN ID) memset(rxBuffer, 0, sizeof(rxBuffer)); char *msg3 = "ATID\n"; qDebug() << "Get XBee PAN ID ( ATID )"; util.writeToSerialPort(fd,msg3); qDebug() << "XBee written to, waiting for response which is integer of current PAN"; while (true) { int readNumberOfBytes = util.readFromSerialPort(fd,rxBuffer,4096); printf("Received ( %d bytes ): %s\n", readNumberOfBytes,rxBuffer); break; } ///////////////////////////////////////////////////////////////////////////// // AT (get current PAN ID <VALUE>) memset(rxBuffer, 0, sizeof(rxBuffer)); char *msg4 = "ATID 3137\n"; qDebug() << "Check if XBee is responding ( ATID 3137 )"; util.writeToSerialPort(fd,msg4); qDebug() << "XBee written to, waiting for response after telling it to change to PAN 3137"; while (true) { int readNumberOfBytes = util.readFromSerialPort(fd,rxBuffer,4096); printf("Received ( %d bytes ): %s\n", readNumberOfBytes,rxBuffer); break; } ///////////////////////////////////////////////////////////////////////////// // AT (get current PAN ID) memset(rxBuffer, 0, sizeof(rxBuffer)); char *msg5 = "ATID\n"; qDebug() << "Get XBee PAN ID ( ATID )"; util.writeToSerialPort(fd,msg5); qDebug() << "XBee written to, waiting for response which is integer of current PAN"; while (true) { int readNumberOfBytes = util.readFromSerialPort(fd,rxBuffer,4096); printf("Received ( %d bytes ): %s\n", readNumberOfBytes,rxBuffer); break; } ///////////////////////////////////////////////////////////////////////////// // AT (get current PAN ID <VALUE>) memset(rxBuffer, 0, sizeof(rxBuffer)); char *msg6 = "ATWR\n"; qDebug() << "Write new settings to XBee Flash ( ATWR )"; util.writeToSerialPort(fd,msg6); qDebug() << "XBee written to, waiting for it to write to flash..."; while (true) { int readNumberOfBytes = util.readFromSerialPort(fd,rxBuffer,4096); printf("Received ( %d bytes ): %s\n", readNumberOfBytes,rxBuffer); break; } // Close the file descriptor close(fd); }
读:
void xbee::xbeeRead(char* usbPort) { // Sleep QWaitCondition waitCondition; QMutex mutex; waitCondition.wait(&mutex, 5000); // Utils Linuxutils util; // File descriptor int fd = util.openSerialPort(usbPort); // Continually Read char buffer[4096]; while (true) { // Sleep waitCondition.wait(&mutex, 1000); qDebug() << "Waiting for data..."; int readNumberOfBytes = util.readFromSerialPort(fd,buffer,4096); // Print results printf("Read ( %d bytes ): %s\n", readNumberOfBytes,buffer); } // Close close(fd); }
写:
void xbee::xbeeWrite(char *usbPort) { // Sleep QWaitCondition waitCondition; QMutex mutex; waitCondition.wait(&mutex, 5000); // Utils Linuxutils util; // File descriptor int fd = util.openSerialPort(usbPort); // Continually Write char *buffer = "Hello World!\n"; while (true) { // Sleep waitCondition.wait(&mutex, 1000); int readNumberOfBytes = util.writeToSerialPort(fd,buffer); // Print results printf("Wrote ( %d bytes ): %s\n", readNumberOfBytes,buffer); } }
我可以确定configuration每个模块 – 下面是configurationttyUSB0的示例输出:
Input test type: 4 Opening Serial Port: "/dev/ttyUSB0" Done opening Serial Port "/dev/ttyUSB0" : 6 Did configure port successfully? 0 Writing config string to XBee ( +++ ) XBee written to, waiting for response of 'OK' Received ( 3 bytes ): OK Check if XBee is responding ( AT ) XBee written to, waiting for response of 'OK' Received ( 3 bytes ): OK Get XBee PAN ID ( ATID ) XBee written to, waiting for response which is integer of current PAN Received ( 5 bytes ): 3137 Check if XBee is responding ( ATID 3137 ) XBee written to, waiting for response after telling it to change to PAN 3137 Received ( 3 bytes ): OK Get XBee PAN ID ( ATID ) XBee written to, waiting for response which is integer of current PAN Received ( 5 bytes ): 3137 Write new settings to XBee Flash ( ATWR ) XBee written to, waiting for it to write to flash... Received ( 3 bytes ): OK Waiting for data...
即使我可以看到我正在写一个while循环的ttyUSB1设备,但我在ttyUSB0上没有收到任何东西。
任何想法,为什么这是发生? 谢谢!
看起来你仍然有两个XBees在命令模式 ,这将阻止这些无线电模块之间的任何RF数据传输。 发送到XBee的任何串行数据将被忽略,除非行以“AT”命令前缀开头。
完成每个XBee的配置后,发出“ATCN”命令退出命令模式(应该没有“OK”响应)。
然后,您发送到XBee的任何串行数据将通过其无线电传输,而(其它)XBee接收到的RF数据将通过其串行端口输出,供您的程序读取。
要重新进入一个XBee模块的命令模式,一秒钟(这是默认的保护时间)不应该发送到XBee串行端口,发送一个三个字符的“+++”字符串(三个加号在1秒内),然后再沉默一秒钟。 XBee应该回应一个“确定”的提示。
所有这些都是标准的Hayes调制解调器AT命令行为。