gpt4 book ai didi

java - XBee S1 通信问题

转载 作者:太空狗 更新时间:2023-10-29 23:05:01 26 4
gpt4 key购买 nike

我有 2 个 XBee S1 模块配置为 API 模式 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 不闪烁。

最佳答案

问题很复杂(由几个较小的问题组成)。按照@tomlogic 的建议从两端转储请求和响应帧非常有帮助。

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

XBee Explorer 有 4 个 LED。一个是电源,通电时应始终呈红色。其他 3 个,取决于您拥有的浏览器,可能称为 rx, tx, rssidin, dout, rssi

传输代码运行时,首先要保证rxtx每秒同时闪烁。 IE。信号每秒发送一次。

当接收代码运行并调用readPacketUntilAvailable时,接收XBee explorer 上的LED 应如下发光:rssi 持续发光,txdout 应该闪烁。

既然我们知道硬件没问题,我们就可以调试软件部分了。

我的问题是接收代码。当我们设置接收 XBee 时,我们需要确保我们做了两件事。首先,我们调用 xbee.begin(baudRate)。其次,我们应该重置模块。

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

最后但同样重要的是,readPacketUntilAvailable 方法将重置响应。我们在循环中调用这个函数。无论发射器发送什么其他数据,我们得到的第一个响应都会被重复。

在我的例子中,接收者得到的第一个响应是 MODEM_STATUS_RESPONSE(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);
}
}

关于java - XBee S1 通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20865973/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com