XBee系列2接收数据包时冻结并超时

1 投票
2 回答
617 浏览
提问于 2025-04-18 06:04

我有两个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 个回答

0

把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
1

请注意,XBee模块有两种不同的API模式。ATAP=1是标准模式,而ATAP=2是转义模式。

你需要确保你使用的代码库设置与XBee模块上编程的模式相匹配。

以python-xbee为例,你需要在构造函数中添加escaped=True。Java库可能也有类似的设置。

不过,我个人认为使用转义API模式没有什么好处。我建议直接在模块上设置ATAP=1,而不是尝试为转义模式配置库。

撰写回答