[英]Xbee API - Packet Listener seems not to work
我有一個正在嘗試從與Arduino開發板連接的其他Xbee中讀取數據包的類。 這是課程:
public class XbeeReceiver2 {
private XBee xbee;
private int[] payloadToSend;
private int[] payloadReceived;
private Queue<XBeeResponse> queue = new ConcurrentLinkedQueue<XBeeResponse>();
public XBeeResponse response;
private final static Logger LOGGER = Logger.getLogger(XbeeReceiver2.class .getName());
public XbeeReceiver2(){
xbee = new XBee();
}
public void openXbeeConnection(String portNumber){
try {
xbee.open(portNumber, 9600);
xbee.addPacketListener(new PacketHandler());
} catch (XBeeException e) {
System.out.println("" + portNumber + " - connection problems");
e.printStackTrace();
}
};
public void readPacket(){
System.out.println(queue.isEmpty());
while((response = queue.poll()) != null){
try {
response = xbee.getResponse();
LOGGER.info("received response " + response.toString());
if (response.getApiId() == ApiId.ZNET_RX_RESPONSE){
ZNetRxResponse rx = (ZNetRxResponse) response;
payloadReceived = rx.getData();
}
} catch (XBeeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
public void closeXbeeConnection(){
xbee.close();
};
private class PacketHandler implements PacketListener{
@Override
public void processResponse(XBeeResponse response) {
//if (response instanceof XBeeResponse){
queue.offer(response);
//}
}
}
}
在主程序中,我有以下代碼段:
XbeeReceiver2 xbeeReceiver = new XbeeReceiver2();
xbeeReceiver.openXbeeConnection("COM23");
xbeeReceiver.readPacket();
但是,當我運行它時,由於隊列中存儲了XbeeResponse的任何實例,因此readPacket()
方法將在循環開始時卡住。 但是,當我將readPacket()方法中的while
條件從while((response = queue.poll()) != null)
更改為while(true)
,它就可以工作。 這意味着我正在得到響應,但是我認為在某些頁面上閱讀時,使用while(true)
是一個不錯的解決方案。 因此,我更喜歡使用PacketListener
。
如果有人有主意,為什么我的PacketListener
不起作用,那就太好了。
好吧,我找到了解決方案,這並不難。 在開始循環之前,我從Xbee獲得了響應並將其添加到隊列中,因此它在開始時並沒有中斷。 我在while循環結束時所做的相同,在其中添加了另一個響應。
這是我的openConnection
方法:
public void openXbeeConnection(String portNumber){
try {
xbee.open(portNumber, 57600);
xbee.addPacketListener(new PacketHandler());
response = xbee.getResponse();
queue.add(response);
} catch (XBeeException e) {
System.out.println("" + portNumber + " - connection problems");
e.printStackTrace();
}
};
在main方法的while循環中,它看起來像這樣:
while ((response = queue.poll()) != null){
//LOGGER.info(response.toString());
int[] payload = xbeeReceiver.readPacket();
dbHandler.updateDB(payload);
int[] payloadToSend2 = dbHandler.retrieveDataFromFB();
xbeeReceiver.sendPacket(payloadToSend2);
try {
XBee xbee = xbeeReceiver.getXbee();
response = xbee.getResponse();
queue.add(response);
} catch (XBeeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.