为 '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(...))
,我敢打赌,解决任何可能存在的差异将很容易。
我的脚本正在监视远程 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(...))
,我敢打赌,解决任何可能存在的差异将很容易。