未从wait_read_frame()获取响应

2024-09-30 18:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我无法让pythonxbee库从我的远程路由器接收响应。他们有联系。本地Xbee是协调器API,远程是位于的路由器。在

这似乎不是一个连接问题,因为我可以使用XCTU发送和接收远程数据包而没有问题。我用的是第二轮Xbees。在

我添加了一个帮助解析类的串行响应。它可以很好地打印出本地'at'命令,但是所有的'remote'uat'命令都挂起,没有输出响应。我可以发出一个远程的命令(无需等待响应),远程XBee会正确处理它。发出远程命令挂起在wait_read_frame()处。我试着等几分钟,但还是卡住了。在

我试图查询D1输入pin并返回其状态(high\x05,low\x04或off\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()

Tags: import命令selfreaddata远程defserial
2条回答

我注意到建立图书馆有两件事:

  1. 在我签出的版本中基准.py第74行,如果设置了回调,则启动后台线程的代码被注释掉。既然你收到了阅读请求,我不认为这是你的问题,但要做好准备,以防其他人遇到类似问题。你可以打电话来xbee.开始()手动使线程运行。

  2. 我发现启用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值附加到参数中,由长度off 4决定。在

答:您需要在数据包中包含一个帧标识。来自约翰·福斯特的XBee Cookbook

Byte: frame id. This is an arbitrary value chosen by the host. The value will be returned in the response packet, except that a value of 0 will suppress the response packet.

向数据包中添加一个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

相关问题 更多 >