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

Python 从XBee接收的pySerial数据未正确显示,python,pyserial,xbee,Python,Pyserial,Xbee,我正试图让多个XBee作为传感器和输出设备运行,以便将它们的样本发送给下面连接的协调器XBee,并在指示时打开和关闭这些远程XBee。这个“接收数据”问题类似于栈溢出问题,但我不认为它是由这个问题和它的分辨率来回答的。 那么,哪些步骤会重现问题? 使用PythonXBee(2.1.0版或2.0.0版)、pySerial最新版本2.6.0、运行中的Python2.7.3(7.0) 运行下面的脚本 所有XBEE均为XB24-Z7-WIT-004系列2。协调员处于API2模式。我在AT和API1或AP

我正试图让多个XBee作为传感器和输出设备运行,以便将它们的样本发送给下面连接的协调器XBee,并在指示时打开和关闭这些远程XBee。这个“接收数据”问题类似于栈溢出问题,但我不认为它是由这个问题和它的分辨率来回答的。 那么,哪些步骤会重现问题?

  • 使用PythonXBee(2.1.0版或2.0.0版)、pySerial最新版本2.6.0、运行中的Python2.7.3(7.0)

  • 运行下面的脚本

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

  • 预期输出是什么?我看到的是什么?

    我希望作为脚本结果或作为输出从接收的地址是正确的“源地址”,即x13\xa2\x00\x40\x79\xe6\x5f,但我接收的是\x00\x13\xa2\x00@y\xe6。“source\u 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模型B上使用python xbee(2.1.0版或2.0.0版)、PySerial最新版本2.6.0、python 2.7.3(最近升级到最新版本,试图解决这一问题)

    注意事项:

    {'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
    
    当我使用ZigBee操作员软件时(基于Windows,通过老式COM端口),地址和整个消息被正确发送和接收。最后,pySerial很可能没有任何问题,我可能只是在代码中对其进行了修改,尽管这并不能解释为什么已经显示错误。此外,所有串行端口参数都已检查,XBee在Vcc和grou之间仔细地解耦或过滤nd引脚等

    更新,在进一步调查之后,如果有什么问题的话,问题可能与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上,我已经接收到错误的数据。这是在我的脚本之前。(请参阅本文的评论,作为后来发现的结果。)


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

    事实上,
    @
    \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 7E 00 16 92 00 13 A2 00 40 79 E6 5F DF13 01 00 40 09 00 40 02 04 02 07 2E 仅解码头的第一个字段:

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

    Hi Sylvain,谢谢你的快速回答。我同意“值”是正确的。这使得我很难直接使用它来显示它(以便回复发送的XBee)。我尝试了API 1和API 2模式,但在编写脚本之前,我花了一些时间才意识到问题的存在。我不确定为什么pyserial会正确显示一些字符,然后在数据中的@符号处停止显示。我不知道如何配置pyserial库(如前所述,我不是编程专家)因此,我一直在努力。更多的调查。我可以让Minicom终端程序(包含在PySerial中)执行十六进制转储,我可以使用它的输出,因为它可以正确转储,但是如何让PySerial库在我的脚本(上面列出的脚本)中使用时执行相同的十六进制转储。我可以使用重新格式化的('pretty_value')来接收和组织数据。当我需要重新使用数据传输到相同的XBees时,我将看到它是如何工作的。我将发布如何工作的,但可能需要一些时间才能将其整理出来。感谢您在这方面的帮助。