【问题标题】:What is the correct format for dest_addr using XBee Python library?使用 XBee Python 库的 dest_addr 的正确格式是什么?
【发布时间】:2020-05-23 01:01:04
【问题描述】:

我正在使用python-xbee 和 Python 3.7 将 API 命令从连接到 Beaglebone Black 上的 UART1 的 XBee 发送到远程 XBee。两者都是第 1 版 Pro 型号。

我的远程 XBee(我正在向其发送命令的那个)具有以下地址:

SH=0013A200
SL=40DD7DCD

当我使用 64 位地址的低位部分提交命令时

xbee.remote_at(dest_addr='\x40\xDD\x7D\xCD', command='0x17', parameter=D0_LOW, frame_id='A')

我收到错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xdd' in position 1: ordinal not in range(128)

我的代码如下:

from xbee import XBee from serial import Serial

PORT = '/dev/ttyO1' 
BAUD = 9600

# Send 0x17 AT command with parameter 04 for low (off), 05 for high (on)
# D0=4 Low
# D0=5 High

D0_LOW = 4 
D0_HIGH = 5

ser = Serial(PORT, BAUD)

xbee = XBee(ser)

xbee.remote_at(dest_addr='\x40\xDD\x7D\xCD', command='0x17', parameter=D0_LOW, frame_id='A')
# Wait for and get the response

print(xbee.wait_read_frame())

ser.close()

我的问题是——当知道高字节和低字节并且没有使用控制器(仅点对点)时,dest_addr 的正确格式是什么?

如果我将地址更改为使用十六进制(例如 \0x40\0xDD\0x7D\0xCD),则错误消息是

The data provided for 'dest_addr' was not 2 bytes long

我需要将地址格式化为 ASCII 2 字节吗?

【问题讨论】:

    标签: python pyserial xbee


    【解决方案1】:

    我认为您可能会遇到问题,因为您的 dest_addr 是一个常规的 Python 字符串,而不是一个字节字符串。您应该尝试以下方法。

    xbee.remote_at(dest_addr=b'\x40\xDD\x7D\xCD', command='0x17', parameter=b'\x04', frame_id='A')
    

    【讨论】:

    • 谢谢马克斯。我试过了,我收到了同样的错误 - 为“dest_addr”提供的数据不是 2 个字节长。
    • 查看文档,地址确实应该只有 2 个字节,而当前指定为 4 个字节。你可以尝试运行xbee.send("at", frame='A', command='MY') 看看它返回什么?
    • 文档太可怕了!它没有解释如何从 64 位地址派生 2 字节地址。运行该命令会无限期地等待。
    • 您没有使用 digi-xbee 库有什么原因吗?
    • 让我重新措辞。有大量可用的文档。流程对我来说并不直观。我更喜欢概述加上超过 3 行的示例。这并不意味着文档不好。它只是不适合我的学习方式。作为一名研究人员,我习惯于在短时间内摄取大量信息 - 但每个人都是不同的。
    【解决方案2】:

    来自documentation

    可以在定义为 api_responses 的 xbee.ieee.XBee(或 XBee ZB 设备的 xbee.zigbee.ZigBee)中找到所有支持的数据帧及其各自字段的列表。

    也许您可以使用help(xbee.ieee.XBee)help(xbee.zigbee.ZigBee)(甚至help(xbee.remote_at))来获取方法及其参数的列表。

    我还在该页面上看到了source_addr_long,所以也许您可以为您的remote_at() 调用指定dest_addr_long

    【讨论】:

      【解决方案3】:

      答案如下:

      remote_xbee='40DD7DCD'
      frame_id = b'\x01'
      
      #For D0 Off
      xbee.remote_at(dest_addr_long=remote_xbee,command='D0',parameter='\x04', frame_id=frame_id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-20
        • 2020-10-22
        • 2013-08-04
        相关资源
        最近更新 更多