为 'dest_addr_long' 提供的数据不是 8 字节长

The data provided for 'dest_addr_long' was not 8 bytes long

我的脚本正在监视远程 xbee 状态的变化。为此,我需要将目标长地址发送到从协调器获得的路由器。如果我像这样显式输入目标长地址,一切都会很好:

addr = '\x00\x13\xA2\x00@\n!\x1C'    
xbee.remote_at(dest_addr_long=addr, command=mycommand, frame_id='\x01')

它给了我想要的数据输出

{'status': '\x00', 'source_addr': '\x7fD', 'source_addr_long': '\x00\x13\xa2\x00@\n!\x1c', 'frame_id': '\x01', 'command': 'D0', 'parameter': '\x05', 'id': 'remote_at_response'}

我可以从中读取参数以确定xbee的状态。

我遇到的问题是我事先不知道地址。当我 运行 这个命令

我明白了
mysourceaddrlong = repr(data['source_addr_long'])[1:-1] 
addr = "\".join([(i[0]+i[1:].upper()) for i in mysourceaddrlong.split('\') if i])
addr = addr[1:] #remove the x in front
addr = r"\x"+addr #add \x to the front and save it as a raw string
print "Formatted addr: %s" % addr

输出:

格式化地址:\x00\x13\xA2\x00@\n!\x1C 这个格式化的地址在我看来是完全一样的,但是当我 运行 我的 at 命令像这样时它不起作用:

xbee.remote_at(dest_addr_long=addr, command=mycommand, frame_id='\x01')

我收到一条错误消息

ValueError:为 'dest_addr_long' 提供的数据不是 8 个字节长

我在下面包含了整个脚本:

#! /usr/bin/python
import serial
import time
from xbee import XBee

ser = serial.Serial('/dev/ttyUSB0', 9600)
xbee = XBee(ser)

def print_data(data):
    print data
    mycommand = data['command']
    mysourceaddrlong = repr(data['source_addr_long'])[1:-1] 
    addr = "\".join([(i[0]+i[1:].upper()) for i in mysourceaddrlong.split('\') if i])
    print "incorrectly formatted addr: %s" % addr 
    addr = addr[1:] #remove the x in front
    addr = r"\x"+addr #add \x to the front and save it as a raw string
    print "formatted addr: %s" % addr
    try:
        xbee.remote_at(dest_addr_long=addr, command=mycommand, frame_id='\x01')
        response = xbee.wait_read_frame()
        myhexparameter = response['parameter'] 
        myparameter =  ord (myhexparameter)
        if myparameter == 4:
            print "Which means pin %s is OFF" % mycommand
        if myparameter == 5:
            print "Which means pin %s is ON" % mycommand
    except KeyboardInterrupt:
        pass

xbee = XBee(ser, callback=print_data)

while True:
    try:
        time.sleep(0.001)
    except KeyboardInterrupt:
        break

xbee.halt()
ser.close()

formatted_addr(您在第二个代码段中计算的 addr 我的名字)仅 出现 addr 相同(正如您在第一个代码段中设置的那样),因为您正在通过 __str__ 的绞尽脑汁(间接通过 print),它以可能的歧义为代价争取美观的输出。改为尝试:

print(repr(addr))

print(repr(formatted_addr))

您会看到不同之处——所有这些反斜杠字符实际上都在 formatted_addr 字符串中(并且在 repr 中加倍),而它们不在 addr 中(它们仅显示为转义序列的一部分)。

我无法自己重现问题,因为我无权访问您的设置,但我怀疑

actual_addr = data['source_addr_long']

实际上是你想要的,没有围绕它的所有字符串处理旋转。尝试

print(repr(actual_addr))

除非问题得到解决,否则请告诉我们您从这三个方面到底看到了什么 print(repr(...)),我敢打赌,解决任何可能存在的差异将很容易。