没有得到wait_read_frame()的响应

时间:2014-02-18 05:23:44

标签: python xbee

我无法让python-xbee库从我的远程路由器接收响应。他们是联系在一起的。本地Xbee是协调器API,远程是路由器AT。

它似乎不是连接问题,因为我可以使用XCTU发送和接收远程数据包而不会出现问题。我正在使用2系列Xbees。

我添加了一个类来帮助解析序列响应。它打印出本地'at'命令的罚款,但所有'remote_at'命令都挂起,没有打印响应。我可以发出remote_at命令(无需等待响应)并由远程XBee正确处理。发出远程命令挂起在wait_read_frame()。我试过等了几分钟,但它只是卡住了。

我正在尝试查询D1输入引脚并返回其状态(高\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()

2 个答案:

答案 0 :(得分:1)

我注意到设置库的两件事:

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

  2. 我发现在这种情况下启用python日志比tappedSerial更有用 - 我通过在顶部添加以下内容来启用日志记录:

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    ch = logging.StreamHandler()
    ch.setLevel(logging.DEBUG)
    logger.addHandler(ch)
    
  3. 这显示我在我的ND响应中添加了4个字节,因为我没有设置为3而不是0.我将发送一个拉取请求,如果已定义,则将DD值附加到参数,由长度确定离开4。

答案 1 :(得分:0)

答案:您需要在数据包中包含frame_id。来自John Foster的XBee Cookbook

  

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

向数据包添加frame_id会得到响应。任意字符(0除外)都有效。

   try:
    xbee.remote_at(dest_addr_long=myRouter, command='D1', frame_id='A')
    response = xbee.wait_read_frame()
    print(response)

  except KeyboardInterrupt:
    pass