【问题标题】:XBee Linux Serial Port on Raspberry Pi树莓派上的 XBee Linux 串口
【发布时间】:2013-08-28 02:02:08
【问题描述】:

我有 2 个 Adafruit XBee 2 模块,每个模块通过 USB 集线器通过 1 条 FTDI 电缆(ttyUSB0 和 ttyUSB1)连接到 Raspberry Pi。我将两个 XBee 模块独立配置为在同一个 PAN 上,然后我尝试用一​​个在 while 循环中读取,并在另一个的 while 循环中写入一条简单的消息。出于某种原因,我从未从第二个端口读取任何内容。

这是我正在使用的测试代码。

配置:

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 上没有收到任何内容。

关于为什么会发生这种情况的任何想法?谢谢!

【问题讨论】:

    标签: linux serial-port raspberry-pi at-command xbee


    【解决方案1】:

    看起来您的两个 XBees 仍处于 命令模式,这将阻止这些无线电模块之间的任何射频数据传输。发送到 XBee 的任何串行数据都将被忽略,除非该行以“AT”命令前缀开头。

    完成每个 XBee 的配置后,发出“ATCN”命令退出命令模式(应该没有“OK”响应)。
    然后,您发送到 XBee 的任何串行数据都将通过其无线电传输,而(其他)XBee 接收到的 RF 数据将在其串行端口上输出以供您的程序读取。

    要在 XBee 模块上重新进入命令模式,一秒钟内(这是默认保护时间)不应向 XBee 串口发送任何内容,发送三个字符串“+++”(三个加号1 秒内),然后再静音 1 秒。 XBee 应以“OK”提示响应。

    所有这些都是标准的 Hayes 调制解调器 AT 命令行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2017-05-03
      • 2015-04-26
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多