Python 未从wait\u read\u frame()获取响应

Python 未从wait\u read\u frame()获取响应,python,xbee,Python,Xbee,我无法让python xbee库接收来自远程路由器的响应。他们是有联系的。本地Xbee是一个协调器API,远程是一个路由器 这似乎不是一个连接问题,因为我可以使用XCTU毫无问题地发送和接收远程数据包。我正在使用系列2 Xbees 我添加了一个类来帮助解析串行响应。对于本地“at”命令,它可以正常打印,但所有“remote_at”命令都挂起,没有打印响应。我可以发出remote_at命令(无需等待响应),远程XBee可以正确处理该命令。发出远程命令在wait_read_frame()处挂起。我试

我无法让python xbee库接收来自远程路由器的响应。他们是有联系的。本地Xbee是一个协调器API,远程是一个路由器

这似乎不是一个连接问题,因为我可以使用XCTU毫无问题地发送和接收远程数据包。我正在使用系列2 Xbees

我添加了一个类来帮助解析串行响应。对于本地“at”命令,它可以正常打印,但所有“remote_at”命令都挂起,没有打印响应。我可以发出remote_at命令(无需等待响应),远程XBee可以正确处理该命令。发出远程命令在wait_read_frame()处挂起。我试着等了几分钟,但就是卡住了

我正在尝试查询D1输入pin并获取其状态(高
\x05
、低
\x04
或关
\x00

这是我用来调试的代码。我做错了什么

from xbee import XBee
import time
from serial import Serial

PORT = '/dev/ttyAMA0'
myRouter = 'a big long hex string...'

def message_received(data):
  print data

class TappedSerial(Serial):
  def __init__(self, *args, **kwargs):
    super(TappedSerial, self).__init__(*args, **kwargs)

  def read(self, *args, **kwargs):
    data = super(Serial, self).read(*args, **kwargs)
    print ("read: ", repr(data))
    return data

  def write(self, data, **kwargs):
    print("wrote: ", repr(data))
    return super(Serial, self).write(data, **kwargs)

def main():

  tapped_ser = TappedSerial(port=PORT, baudrate=9600)
  xbee = XBee(tapped_ser) #, callback=message_received)

  try:

    xbee.remote_at(dest_addr_long=myRouter, command='D1', options='\x00')
    response = xbee.wait_read_frame()
    print(response)

  except KeyboardInterrupt:
    pass

  finally:
    tapped_ser.close()
    print("exiting program")

if __name__ == '__main__':
  main()

答:您需要在数据包中包含一个frame_id。来自约翰·福斯特:

字节:帧id。这是主机选择的任意值。该值将在响应数据包中返回, 除非值为0将抑制响应数据包

将帧id添加到数据包会得到响应。任何任意字符(0除外)都有效


我在设置库时注意到两件事:

  • 在我签出的版本中,在base.py第74行,如果设置了回调,则启动后台线程的代码将被注释掉。既然你收到了阅读请求,我不认为这是你的问题,但请保持警惕,以防其他人遇到类似问题。您可以手动调用xbee.start()使线程运行

  • 在本例中,我发现启用python日志记录比启用tappedSerial更有用—我通过在顶部添加以下内容启用日志记录:

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    logger.addHandler(ch)
    

  • 这表明我在ND响应中添加了4个字节,因为我没有设置为3而不是0。如果定义了DD值,我将发送一个pull请求,该请求会将DD值附加到参数中,具体取决于长度被关闭4。

    Nevermind。这会从XBee返回一个响应,但它只通过我正在使用的TappedSerial类打印出响应。XBee库仍然挂起。
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    logger.addHandler(ch)