2013-08-28 45 views
2

我有2個Adafruit XBee 2模塊,每個模塊都通過一個USB集線器與1根FTDI電纜(ttyUSB0和ttyUSB1)連接到Raspberry Pi。我將兩個XBee模塊獨立配置在同一個PAN上,然後嘗試在一個while循環中讀一個,然後在另一個while循環中寫一個簡單的消息。出於某種原因,我從來沒有從第二個港口讀任何東西。RasBee Pi上的XBee Linux串行端口

這是我正在使用的測試代碼。

配置:

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); 

    } 

} 

我可以肯定地配置每個模塊 - 這裏是輸出示例配置ttyUSB0:

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上沒有收到任何東西。

任何想法,爲什麼發生這種情況?謝謝!

回答

3

看起來你仍然有兩個XBees在命令模式這將阻止這些無線電模塊之間的任何RF數據傳輸。除非行以「AT」命令前綴開頭,否則任何發送到XBee的串行數據都將被忽略。

完成配置每個XBee後,發出「ATCN」命令退出命令模式(應該沒有「OK」響應)。
然後,您發送到XBee的任何串行數據都將通過其無線電傳輸,而(其他)XBee接收到的RF數據將通過串口輸出,供您的程序讀取。

要在XBee模塊上重新進入命令模式,一秒鐘內不應該向XBee串口發送任何消息(這是默認的保護時間),發送一個三字符的「+++」字符串(三加1秒內出現跡象),然後再沉默1秒鐘。 XBee應該以「OK」提示響應。

所有這些都是標準的Hayes調制解調器AT命令行爲。

+0

非常感謝! – PhilBot