2

我正在尝试让多个 XBee 作为传感器和输出设备运行,以将它们的样本发送到如下所示连接的协调器 XBee,并在收到指示时打开和关闭这些远程 XBee。我的这个 'received data' 问题似乎类似于 Stack Overflow question pySerial and reading binary data,但我认为该问题及其解决方案并未回答它。

那么哪些步骤会重现问题呢?

  1. 在运行Debian Wheezy (7.0)的Raspberry Pi上使用 python-xbee(版本 2.1.0 或 2.0.0)、pySerial 最新版本 2.6.0、Python 2.7.3 。

  2. 运行下面的脚本

  3. 所有 XBee 均为 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+。(“源地址”相关的东西由 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(最近升级到最新版本,试图解决这个问题。

笔记:

当我使用 ZigBee Operator 软件(基于 Windows,通过老式 COM 端口)时,地址和整个消息都可以正确发送和接收。最后,pySerial 很可能没有任何问题,我可能只是在代码中搞砸了它,尽管这并不能解释为什么Miniterm已经显示它是错误的。此外,所有串行端口参数都已检查,XBee 在 Vcc 和接地引脚之间仔细解耦或过滤等。

更新,经过进一步调查,如果有的话,问题可能与 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)的终端程序,我已经收到错误的数据。这是在我的剧本之前。(由于后来的发现,请参阅对这篇文章的评论。)

正确接收“硬件地址”对我来说很重要,因为 XBee 中的 MY 地址可以动态更改(我认为协调器会即时分配它)。当向特定 XBee 模块发送特定命令时,这将是一个问题,显然要考虑到非常特定的结果。我该如何解决这个问题?

4

1 回答 1

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
东风 13 01 01 00 40 09 00 40 02 04 02
07 2E

只需解码标题的第一个字段字段:

  • 这是一个 16 字节长的 0x92“IO Sample Rx”帧。
  • 源地址 64 位为 00:13:A2:00:40:79:E6:5F
  • 源地址 16 位为 DF:13
  • 打包已确认 (0x01)
于 2013-06-21T17:34:11.937 回答