XBee S1通信问题

时间:2014-01-01 05:57:11

标签: java c++ embedded xbee

我在API模式下配置了2个XBee S1模块1. XBee模块1是信号发送器,XBee模块2是信号接收器。问题是接收器没有从发射器接收任何东西(或者看起来如此)。

发射机配置如下:

AP 1
MY 1
ID 1984
DL 2
CH C

默认情况下保留其他所有内容。 发送器连接到XBee Explorer。 XBee Explorer通过USB连接到PC。

下面一段代码每1秒发送一次信号:

public class Main {

    private Main() {
        XBee xbee = new XBee();
        try {
            xbee.open("/dev/ttyUSB0", 9600);
            final XBeeRequest request = new TxRequest16(new XBeeAddress16(0, 2), new int[] { 1 });

            //noinspection InfiniteLoopStatement
            while (true) {
                xbee.sendSynchronous(request);
                Thread.sleep(1000);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            xbee.close();
        }
    }

    public static void main(String[] args) {
        new Main();
    }
}

使用了Java XBee API库:https://code.google.com/p/xbee-api/ 我看到TX LED每秒闪烁一次。

接收器配置如下:

AP 1
MY 2
ID 1984
DL 1
CH C

默认情况下保留其他所有内容。 接下来使用接收器接线: enter image description here

接收器通过XBee Explorer连接到面包板。连续性测试表明,电流在XBee RX和mbed P27之间以及XBee TX和mbed P28之间流动良好。

以下代码在mbed(LPC1768)上运行以接收数据包:

Serial terminal(USBTX, USBRX);

while(1) {
    terminal.puts("Reading packet...\r\n");
    xbee.readPacketUntilAvailable();
    terminal.puts("Packet available\r\n");

    XBeeResponse response = xbee.getResponse();
    if (response.isAvailable()) {
        char tmp[20];
        sprintf(tmp, "0x%02X", response.getApiId());
        terminal.puts("Response available at API: ");
        terminal.puts(tmp);
        terminal.puts("\r\n");
        uint8_t api = response.getApiId();
        if (api == RX_16_RESPONSE) {
            Rx16Response rx16 = Rx16Response();
            response.getRx16Response(rx16);
            uint8_t len = rx16.getDataLength();
            char l[20];
            sprintf(l, "%d", len);

            terminal.puts("We have data: ");
            terminal.puts(l);
            terminal.puts("\r\n");
        }
    }
    wait(1);
}

使用了用于XBee API模式的流行Arduino / mbed库。来源位于:http://mbed.org/users/okini3939/code/XBee/

控制台的输出始终为:Reading packet...。 并且接收器上的RX LED不闪烁。

3 个答案:

答案 0 :(得分:1)

问题很复杂(包括一些小问题)。正如@tomlogic建议的那样,从两端转储请求和响应框架非常有用。

为解决这些问题,我首先确保硬件部分正常工作。

XBee explorer有4个LED。一个是电源,通电时应始终发红光。另外3个,根据您拥有的资源管理器,可能会被称为rx, tx, rssidin, dout, rssi

传输代码时,我们首先需要确保rxtx每秒同时闪烁。即信号每秒发送一次。

接收代码并调用readPacketUntilAvailable时,接收XBee资源管理器的LED应亮起如下:rssi不断发光,txdout应闪烁。

既然我们知道硬件很好,我们可以调试软件部分。

我的问题在于接收代码。当我们设置接收XBee时,我们需要确保做两件事。首先,我们致电xbee.begin(baudRate)。第二,我们应该重置模块。

reset = 0;
wait_ms(100);
reset = 1;
wait_ms(100);

最后,但并非最不重要的是,readPacketUntilAvailable方法重置响应。我们在循环中调用此函数。无论发送器发送了什么其他数据,我们都会重复我们得到的第一个响应。

接收器在我的情况下得到的第一个响应是MODEM_STATUS_RESPONSE(HEX中的 0x8A )。并且未读取后续数据包。必须调用readPacket,因为该方法将重置先前的响应。

我的接收代码现在看起来像这样:

XBee xbee(p28, p27);
DigitalOut reset(p11);
DigitalOut mbed_led1(LED1);

int main() {
    Serial terminal(USBTX, USBRX);
    while(!terminal.readable()) {
        wait_ms(10);
    }
    terminal.getc();
    mbed_led1 = 1;
    xbee.begin(9600);
    reset = 0;
    wait_ms(100);
    reset = 1;
    wait_ms(100);

    while(1) {
        terminal.puts("Reading packet...\r\n");
        xbee.readPacket(500);
        XBeeResponse response = xbee.getResponse();
        if (response.isAvailable()) {
            terminal.puts("Packet available\r\n");
            XBeeResponse response = xbee.getResponse();

            char tmp[20];
            sprintf(tmp, "0x%02X", response.getApiId());
            terminal.puts("Response available at API: ");
            terminal.puts(tmp);
            terminal.puts("\r\n");
            uint8_t api = response.getApiId();
            if (api == RX_16_RESPONSE) {
                Rx16Response rx16 = Rx16Response();
                response.getRx16Response(rx16);
                uint8_t len = rx16.getDataLength();
                char l[20];
                sprintf(l, "%d", len);

                terminal.puts("We have data of length ");
                terminal.puts(l);
                terminal.puts("\r\n");
            }
        }

        wait(1);
    }
}

答案 1 :(得分:0)

请注意,由于您在API模式下运行,因此未使用ATDL,因此您无需进行设置。

您链接到的Java库记录为仅与ATAP=2一起使用。尝试在发送节点上更改该设置。

您应该转储任何进入发射器的数据包。 XBee模块应该生成一个“发送状态”(0x89)帧,可以帮助调试。

答案 2 :(得分:0)

我认为从Xbee读取数据的最简单方法就是在单独的线程中打开串口并不断循环为0x7E(起始分隔符)。这就是我正在使用我的代码,它工作正常。我使用了RxTxSerial库和本教程来启动它: http://embeddedfreak.wordpress.com/java-serial-port-trail/ 我没有我的代码重置xbee或必须等待能够正确接收数据。如果你想查看我的代码,那么我很乐意分享并解释它。