为“dest_addr\u long”提供的数据不是8字节长

2024-05-19 19:29:31 发布

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

我的脚本正在监视远程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的状态。在

我的问题是我不知道前面的地址。我运行这个命令就知道了

^{pr2}$

哪些输出:

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

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

我有个错误说

ValueError:为“dest\u addr\u 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()

Tags: iddataremote地址framecommandatlong
1条回答
网友
1楼 · 发布于 2024-05-19 19:29:31

formatted_addr(我对您在第二个片段中计算的addr的名称)只有看起来与addr(正如您在第一个片段中设置的那样)相同,因为您要通过__str__(间接地通过print)的wringer来传递这两个值(间接地通过print),它以可能的模糊性为代价,努力获得美观的输出。试试看:

print(repr(addr))

^{pr2}$

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

我自己也不能重复这个问题,因为我无法访问你的设置,但我怀疑

actual_addr = data['source_addr_long']

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

print(repr(actual_addr))

除非问题得到解决,请告诉我们您从这三个方面看到了什么,我敢打赌,解决任何可能存在的差异都会很容易。在

相关问题 更多 >