Данные, предоставленные для «dest_addr_long», не имели длины 8 байт.

Мой скрипт отслеживает изменения состояния моего удаленного 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', ' команда': 'D0', 'параметр': '\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()

person Frank Hayward    schedule 17.01.2015    source источник


Ответы (1)


formatted_addr (мое имя для addr, которое вы вычисляете во втором фрагменте) только кажется таким же, как addr (как вы установили его в первом фрагменте), потому что вы проходите оба через отжим __str__ (косвенно через print), который стремится к эстетически красивому выводу за счет возможной двусмысленности. Вместо этого попробуйте:

print(repr(addr))

vs

print(repr(formatted_addr))

и вы увидите разницу - все эти символы обратной косой черты на самом деле находятся в строке formatted_addr (и удваиваются в repr), а не в addr (они отображаются только как часть управляющих последовательностей).

Я не могу воспроизвести проблему сам, так как у меня нет доступа к вашей настройке, но я подозреваю

actual_addr = data['source_addr_long']

на самом деле то, что вы хотите, без всех циклов обработки строк вокруг него. Пытаться

print(repr(actual_addr))

и если проблема не будет устранена, сообщите нам, что именно вы видите из этих трех print(repr(...)), и я уверен, что будет легко исправить любое несоответствие, которое может остаться.

person Alex Martelli    schedule 17.01.2015
comment
print(repr(addr)) дает мне 'x00\\x13\\xA2\\x00@\\n!\\x1C' и print(repr(formatted_addr)) дает мне '\\x00\\x13\\xA2\ \x00@\\n!\\x1C', но даже с двойными обратными косыми чертами (которых, как я полагаю, на самом деле нет, они только отображаются), теперь отформатированный адрес по-прежнему не считается 8-байтовым. Кажется, я попал в ад обратной косой черты. - person Frank Hayward; 17.01.2015
comment
Алекс, спасибо, ты разобрался. Иногда за деревьями не видно леса - и теперь скрипт еще и на 5 строк короче. - person Frank Hayward; 17.01.2015