我的脚本正在监视远程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()
formatted_addr
(我对您在第二个片段中计算的addr
的名称)只有看起来与addr
(正如您在第一个片段中设置的那样)相同,因为您要通过__str__
(间接地通过print
)的wringer来传递这两个值(间接地通过print
),它以可能的模糊性为代价,努力获得美观的输出。试试看:与
^{pr2}$您将看到所有这些反斜杠字符实际上都在
formatted_addr
字符串中(并且在repr
中加倍),而它们不在addr
中(它们只显示为转义序列的一部分)。在我自己也不能重复这个问题,因为我无法访问你的设置,但我怀疑
实际上是你想要的,没有所有的字符串处理旋转。试试看
除非问题得到解决,请告诉我们您从这三个方面看到了什么,我敢打赌,解决任何可能存在的差异都会很容易。在
相关问题 更多 >
编程相关推荐