我正在尝试将多个XBees作为传感器和输出设备运行,以将其样本发送到如下所示连接的协调器XBee,并在指示时打开和关闭这些远程XBees上的内容。我的这个“收到数据”问题似乎与Stack Overflow问题 pySerial and reading binary data 类似,但我不认为它可以解决该问题及其解决方案。
那么哪些步骤会重现这个问题?
使用python-xbee(版本2.1.0或2.0.0),pySerial最新版本2.6.0,Raspberry Pi上运行Debian Wheezy(7.0)的Python 2.7.3。< / p>
运行以下脚本
所有XBees均为XB24-Z7-WIT-004系列2.协调器处于API2模式。我在AT和API1或API2模式下尝试了我的双传感器XBee,没有任何区别(固件版本的注释反映在附加的.py脚本中的注释)
预期产量是多少?我该怎么看?
我希望作为脚本结果收到的地址,或者Minicom的输出是正确的'source_addr_long',即x13 \ xa2 \ x00 \ x40 \ x79 \ xe6 \ x5f,而是我收到\ x00 \ x13 \ xa2 \ x00 @ y \ xe6。 'source_addr'返回\ xe3 +。 ('source addr'相关内容由python_XBee库处理/完成。)这是我的脚本:
#!/usr/bin/env python2.7
# NOTE - Not my own code - Abrie Willemse
# NOTE - I am not a programmer - Abrie Willemse
# I am using XBee XB24-Z7 WIT-004 for all devices
# Coordinator is running API
# SENSOR_1 and SENSOR_2 are Sensor Routers running AT (firmware XB24ZB 22A7) (I have tried API firmware XB24ZB 23A7) too)
import serial
from xbee import ZigBee
import time, sys, datetime
serial_port = serial.Serial('/dev/ttyAMA0', 9600)
zb = ZigBee(serial_port)
while True:
try:
data = zb.wait_read_frame() #Get data for later use
print data # To check what comes in before processing / parsing (already buggered up)
addr = repr(data ['source_addr_long']) # Working sort of, but with @y... issue in results
file = open('/media/log/senslog.txt','a')
value = float(((data['samples'])[0])['adc-0'])
num = (value * 3.0) / 1023.0
file.write(datetime.datetime.now().strftime('%d-%m-%Y %H:%M:%S') + ' ' + str(addr) + ' ' + str(value) + ' ' + str(num) + '\n')
print str(datetime.datetime.now().strftime('%d-%m-%Y %H:%M:%S') + ' ' + str(addr) + ' ' + str(value) + ' ' + str(num) + '\n')
file.close()
except KeyboardInterrupt:
break
serial_port.close()
这是输出:
{'source_addr_long': '\x00\x13\xa2\x00@y\xe6_', 'source_addr': '\xe3+', 'id': 'rx_io_data_long_addr', 'samples': [{'adc-0': 516, 'adc-3': 519, 'dio-6': False}], 'options': '\x01'}
18-06-2013 14:32:15 '\x00\x13\xa2\x00@y\xe6_' 516.0 1.51319648094
请注意从输出中的 @y 开始的问题。当我将同一个协调器连接到Windows PC时(这是从远程XBee接收的整个数据包),请注意收到的正确数据:
我使用的是哪个版本?在什么操作系统上?
使用python-xbee(版本2.1.0或2.0.0),PySerial最新版本2.6.0,运行Debian Wheezy(7.0)的Raspberry Pi Model B上的Python 2.7.3(最近升级到最新版本,试图解决这个问题。
备注:
当我使用ZigBee Operator软件(基于Windows,通过老式COM端口)时,会正确发送和接收地址和整个消息。最后,pySerial很可能没有任何问题,我可能只是在代码中弄错了,尽管并没有解释为什么Miniterm已经显示错误。此外,还检查了所有串行端口参数,XBee在Vcc和接地引脚之间小心地去耦或滤波等。
UPDATE ,经过进一步调查后,看来如果有的话,问题可能与pySerial库有关,而与python-XBee库无关。我基于以下内容(参考我在帖子前面部分列出的预期结果,以及上面列出的实际结果:
x40 = ascii @ and
x79 = ascii y and
xe6 = seems undefined in [ASCII][7], therefore seems to be coming through OK as xe6 and then finally,
x5f = ascii underscore (_)
因此,我的理论是,由于某种原因,pySerial在\ x00 \ x13 \ x2A \ x00中的最后一个x00之后停止处理流/字符串(或任何正确的技术术语),然后开始添加ASCII字符equivelant改为十六进制字符/值。使用依赖于pySerial库(Miniterm)的终端程序,在Raspberry Pi上,我已经接收错误的数据。这是在我的剧本之前。 (作为后来发现的结果,请参阅此帖子的评论。)
对我来说,正确接收'硬件地址'很重要,因为XBee中的MY地址可以动态改变(我认为协调员可以动态地分配它)。将特定命令发送到特定XBee模块时,这将是一个问题,显然会考虑到非常具体的结果。我该如何解决这个问题?
答案 0 :(得分:2)
事实上@
是 \x40
。 y
是 \x79
。所以“价值观”是正确的......
>>> '\x13\xa2\x00\x40\x79\xe6\x5f' == '\x13\xa2\x00@y\xe6_'
True
如果只是格式化问题,您可以使用类似的东西来显示您的地址:
>>> value = '\x13\xa2\x00@y\xe6_'
>>> pretty_value = ':'.join("{:02X}".format(ord(c)) for c in value)
>>> print(pretty_value)
13:A2:00:40:79:E6:5F
另一方面,在我看来,在访问地址时你离开了一个字节:
Expected: \x13\xa2\x00\x40\x79\xe6\x5f
Actual value: \x00\x13\xa2\x00\x40\x79\xe6
一个可能的原因是您错过了在 API 2 模式下可以转义某些字符的事实。因此,更改数据框中各个字段的实际偏移量。由于您使用的是库,您确定它能正确处理API 2模式吗?是否正确配置了这样做?
关于你的框架:
7E 00 16 92 00 13 A2 00 40 79 E6 5F DF 13 01 01 00 40 09 00 40 02 04 02 07 2E
只需解码标题的第一个字段: