XBee系列2接收数据包时冻结并超时
我有两个XBee Series 2模块,设置成API 2模式。一个是控制器,另一个是终端节点。终端节点连接到一个Arduino,现在只是读取一个模拟传感器的值并发送出去。
目前在使用X-CTU软件时,一切都运行正常。在新版本中,我添加了控制器模块(通过USB连接)。然后我点击设备上的中间按钮,搜索其他网络设备。接着我进入控制台模式。一点击连接按钮,我就开始收到“接收数据包”的信息。查看帧的详细信息,一切都正常。
但是,一旦我尝试使用xbee-api的Java库或python-xbee库,就开始出现问题。我使用的代码完全是从示例中复制过来的(看起来应该可以正常工作)。以下是一个Python代码的示例(在Windows上是COM3,在Linux上是/dev/ttyUSB1。这两个系统都有同样的问题。)
from xbee import XBee
import serial
s = serial.Serial('COM3', 9600)
xbee = XBee(s)
while True:
try:
response = xbee.wait_read_frame()
print(response)
except KeyboardInterrupt:
break
s.close()
应用程序在xbee.wait_read_frame()这行代码上卡住了。当我在Java代码中调用Xbee.open()时,情况也是一样,代码最终到达“sendAtCommand(new AtCommand("AP"));"这一行(或者使用sendSynchronous的替代方法)。这个方法超时并抛出异常。
到目前为止,我不知道接下来该怎么办。在XCTU中可以正常工作,但在任何API中都不行。在wait_read_frame之前,我是否需要做些什么来连接这两个模块?(我认为不需要,因为它们的PAN ID是相同的。实际上,除了固件,所有设置都是一样的。)
谢谢任何帮助!
2 个回答
把XBee换成ZigBee。
在Windows电脑上,我使用的是Python 2.7.5版本。
可以试试下面给出的例子。
代码:
from xbee import ZigBee
import serial
import time
port = serial.Serial(port='COM16',baudrate=9600,timeout=0)
xbee = ZigBee(port,escaped=True)
def filewrite(rcv):
logfile = open("c:\\templog.txt","a")
logfile.write(rcv)
logfile.close
while True:
recv = port.readline().strip()
if (len(repr(recv)) > 2):
try:
response = xbee.wait_read_frame()
filewrite(repr(response))
print repr(response)
except KeyboardInterrupt:
break
请注意,XBee模块有两种不同的API模式。ATAP=1
是标准模式,而ATAP=2
是转义模式。
你需要确保你使用的代码库设置与XBee模块上编程的模式相匹配。
以python-xbee为例,你需要在构造函数中添加escaped=True
。Java库可能也有类似的设置。
不过,我个人认为使用转义API模式没有什么好处。我建议直接在模块上设置ATAP=1
,而不是尝试为转义模式配置库。