[英]XBee S1 communication issue
我在API模式1中配置了2個XBee S1模塊.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不會在接收器上閃爍。
這個問題很復雜(包括一些較小的問題)。 正如@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
(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);
}
}
請注意,因為您在API模式下運行,所以不使用ATDL
因此您不需要設置它。
您鏈接到的Java庫記錄為僅與ATAP=2
。 嘗試在發送節點上更改該設置。
你應該傾倒任何進入發射器的數據包。 XBee模塊應生成“發送狀態”(0x89)幀,以幫助調試。
我認為從Xbee讀取數據的最簡單方法就是在一個單獨的線程中打開串口並不斷循環為0x7E(起始分隔符)。 這就是我正在使用我的代碼,它工作正常。 我使用了RxTxSerial庫和本教程來啟動它: http ://embeddedfreak.wordpress.com/java-serial-port-trail/我沒有我的代碼重置xbee或不得不等待能夠接收數據正確。 如果您想查看我的代碼,那么我很樂意分享並解釋它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.