我在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
默认情况下保留其他所有内容。 接下来使用接收器接线:
接收器通过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不闪烁。
答案 0 :(得分:1)
问题很复杂(包括一些小问题)。正如@tomlogic建议的那样,从两端转储请求和响应框架非常有用。
为解决这些问题,我首先确保硬件部分正常工作。
XBee explorer有4个LED。一个是电源,通电时应始终发红光。另外3个,根据您拥有的资源管理器,可能会被称为rx, tx, rssi
或din, dout, rssi
。
传输代码时,我们首先需要确保rx
和tx
每秒同时闪烁。即信号每秒发送一次。
接收代码并调用readPacketUntilAvailable
时,接收XBee资源管理器的LED应亮起如下:rssi
不断发光,tx
或dout
应闪烁。
既然我们知道硬件很好,我们可以调试软件部分。
我的问题在于接收代码。当我们设置接收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或必须等待能够正确接收数据。如果你想查看我的代码,那么我很乐意分享并解释它。