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

2024-05-21 05:16:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图让多个XBee作为传感器和输出设备运行,将它们的样本发送到一个协调器XBee,如下图所示,并在接到指示时打开和关闭这些远程XBee上的东西。我的这个“接收数据”问题似乎类似于堆栈溢出问题pySerial and reading binary data,但我不认为它是由这个问题及其解决方案所回答的。

那么什么步骤会重现问题?

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

  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+。(与“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(ver 2.1.0,或2.0.0)、PySerial最新版本2.6.0、python2.7.3在运行Debian Wheezy(7.0)的Raspberry Pi模型B上运行(最近升级到最新版本,试图解决这个问题)。

注意:

当我使用ZigBee操作软件(基于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字符添加到十六进制字符/值。使用依赖于pySerial库(minitem)的终端程序,在树莓Pi上,我已经错误地接收了数据。这是在我的剧本之前。(请参阅对这篇文章的评论,这是后来发现的结果。)

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


Tags: and版本脚本sourcedatadatetime地址serial