从XBee收到的pySerial数据未正确显示

时间:2013-06-21 17:20:14

标签: python pyserial xbee

我正在尝试将多个XBees作为传感器和输出设备运行,以将其样本发送到如下所示连接的协调器XBee,并在指示时打开和关闭这些远程XBees上的内容。我的这个“收到数据”问题似乎与Stack Overflow问题 pySerial and reading binary data 类似,但我不认为它可以解决该问题及其解决方案。

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

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

  2. 运行以下脚本

  3. 所有XBees均为XB24-Z7-WIT-004系列2.协调器处于API2模式。我在AT和API1或API2模式下尝试了我的双传感器XBee,没有任何区别(固件版本的注释反映在附加的.py脚本中的注释)

  4. 预期产量是多少?我该怎么看?

    我希望作为脚本结果收到的地址,或者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接收的整个数据包),请注意收到的正确数据:

    Correct data received

    我使用的是哪个版本?在什么操作系统上?

    使用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模块时,这将是一个问题,显然会考虑到非常具体的结果。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

事实上@ \x40y \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

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

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