我正在尝试让多个 XBees 作为传感器和输出设备运行,以将其样本发送到按如下方式连接的协调器 XBee,并根据指示打开和关闭这些远程 XBees 上的开关。我的这个“收到数据”问题似乎与 Stack Overflow 问题类似pySerial和读取二进制数据 https://stackoverflow.com/questions/7640993,但我不认为该问题及其解决方案可以回答这个问题。
那么什么步骤会重现该问题呢?
使用 python-xbee (ver 2.1.0, or 2.0.0), pySerial 最新版本 2.6.0, Python 2.7.3树莓派 http://en.wikipedia.org/wiki/Raspberry_Pi跑步Debian 威兹 https://en.wikipedia.org/wiki/Debian#History (7.0).
运行下面的脚本
所有 XBees 均为 XB24-Z7-WIT-004 系列 2。协调器处于 API2 模式。我在 AT 和 API1 或 API2 模式下尝试了我的双传感器 XBee,没有任何差异(固件版本的注释反映为随附的 .py 脚本中的注释)
什么是预期的输出?我看到了什么?
我期望收到的地址是脚本的结果,或者是来自的输出Minicom https://en.wikipedia.org/wiki/Minicom是正确的“source_addr_long”,即 x13\xa2\x00\x40\x79\xe6\x5f,但我收到 \x00\x13\xa2\x00@y\xe6。 “source_addr”返回 \xe3+。 (“源地址”相关的东西由 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 收到的整个数据包):
我使用什么版本?在什么操作系统上?
在运行 Debian Wheezy (7.0) 的 Raspberry Pi Model B 上使用 python-xbee(版本 2.1.0 或 2.0.0)、PySerial 最新版本 2.6.0、Python 2.7.3(最近升级到最新版本,试图解决这个问题。
Notes:
当我使用 ZigBee Operator 软件(基于 Windows,通过老式 COM 端口)时,地址和整个消息都可以正确发送和接收。最后,pySerial 很可能没有任何问题,我可能只是在代码中搞砸了,尽管没有解释为什么Miniterm http://pyserial.sourceforge.net/examples.html已经显示错误了。此外,所有串行端口参数都已检查,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 字符字符/值代替。在 Raspberry Pi 上使用依赖于 pySerial 库(Miniterm)的终端程序,我already接收数据错误。这是在我的脚本之前。 (请参阅这篇文章的评论作为后来发现的结果。)
正确接收“硬件地址”对我来说很重要,因为 XBee 中的“我的地址”可以动态更改(我认为协调器会动态分配它)。当向特定的 XBee 模块发送特定命令时,这将是一个问题,显然是考虑到非常特定的结果。我该如何解决这个问题?