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

2024-02-07

我正在尝试让多个 XBees 作为传感器和输出设备运行,以将其样本发送到按如下方式连接的协调器 XBee,并根据指示打开和关闭这些远程 XBees 上的开关。我的这个“收到数据”问题似乎与 Stack Overflow 问题类似pySerial和读取二进制数据 https://stackoverflow.com/questions/7640993,但我不认为该问题及其解决方案可以回答这个问题。

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

  1. 使用 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).

  2. 运行下面的脚本

  3. 所有 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 模块发送特定命令时,这将是一个问题,显然是考虑到非常特定的结果。我该如何解决这个问题?


事实上@ is \x40. And y is \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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 XBee 接收的 pySerial 数据未正确显示 的相关文章

随机推荐

  • C# 退出使用 lambda 的泛型 ForEach

    有谁知道是否可以退出使用 lambda 的通用 ForEach 例如 someList ForEach sl gt if sl ToString foo break continue processing sl here some proc
  • 如何从 CFMutableDictionary 检索特定键的值

    In C EventType find 1 gt second可用于查找键 1 的值 我是 Objective C 的新手 我已经实现了CFDictionary为其增加价值 但是我该怎么办 retreive并查看values特定键的 EDI
  • SQL Server通讯协议问题

    我正在使用 VSTS 2008 C ADO Net SQL Server 2008 我对 SQL Server 2008 将使用哪种通信协议的问题 我的问题的更多详细信息 如果连接字符串看起来像这样 是否使用命名管道或 TCP IP 使用不
  • Vue index.html favicon 问题

    我正在使用 Vue 2 0 和 Vue CLI 3 0 我试图让 favicon ico png 文件正常工作 但一点运气都没有 我已将问题缩小到以下范围 由yarn build生成的index html文件转换了这行html代码 to 如
  • 创建我的第一个 JDBC Realm(Glassfish V3)

    我想为我的 Web 应用程序创建一个 JDBC 领域 由于我的用户彼此之间非常不同 我只需要一个表 其中包含领域的用户名和密码 我决定在我的数据库中创建一个名为 ROLE 的新表 与其他用户表的一对一关系 This is how my us
  • 如何知道应用程序正在关闭

    有一个 WPF 应用程序 我想在应用程序关闭时记录 但我无法修改应用程序 一些限制 只是因为业务 因此 我在现有应用程序中创建了一个不可见的表单组件 添加为 dll 库 因此不需要修改现有应用程序 但问题是 我的隐形组件如何知道应用程序正在
  • 上传前预览多张图片

    我想预览多个图像 但问题是如果我上传 2 个图像 我的代码就可以工作 我想预览与用户上传的一样多的内容 这是我的 JavaScript var abc 0 Declaring and defining global increement v
  • C#:获取域中计算机的信息

    为了获取网络中某台计算机的信息 我应该在 C 中使用哪些类 例如谁登录了该计算机 该计算机上正在运行什么操作系统 打开了哪些端口等 查看系统管理 http msdn microsoft com en us library system ma
  • TableTools 导出在多个 JQuery 选项卡上的 DataTables 中不起作用

    我使用 DataTables 1 8 2 TableTools 2 0 1 和 JQuery 1 6 4 在三个 jQuery 选项卡上分别显示一个表格 TableTools 为表格提供了复制 Excel PDF 打印导出功能 并且仅适用于
  • 描述符的 Python 文档字符串

    我使用描述符来定义接口类的寄存器 class Register object def init self address docstring instance docstring self address address self doc
  • 当你没有在 ruby​​ 中指定异常类时,你会捕获哪些异常?

    当您不指定这样的异常类时 您会捕获哪些异常 begin do something rescue puts Exception end 根据我的副本Ruby 编程 1 9 不带参数的救援子句被视为具有参数StandardError 这是来自的
  • 如何在 Windows 中安装适用于 Python 3.4 的 pandas?

    根据the docs http pandas pydata org pandas docs dev install html 这应该有效 从 PyPI 安装 pandas 可以通过 PyPI 中的 pip 安装 点安装熊猫 这可能需要安装许
  • TypeScript:在事件中使用 jquery $(this)

    HTML div div
  • 对每个请求执行代码

    我希望能够对每个将数据填充到 ViewData 的请求执行一些代码 目前 我有一个基本控制器类 我的所有控制器都继承自该类 并且我重写 OnActionExecuting 并在那里执行它 我对这种方法唯一关心的是 创建新控制器的人必须继承基
  • 在事件处理程序中发送不带 XHR 的 http 请求

    如何使用 javascript 作为事件处理程序通过 post get 方法发送 http 请求 谢谢 保罗 好吧 你不想使用 Ajax 您可以使用事件处理程序来提交表单 a href send a
  • Salesforce PhoneGap iPhone 应用程序中的 oAuth2 问题(远程访问应用程序授权问题)

    我使用 PhoneGap 创建了一个 iPhone 应用程序 我遵循了本教程中的代码 构建由 Database com 提供支持的 PhoneGap 移动应用程序 http wiki developerforce com page Buil
  • Android listview - 获取自定义列表视图的文本

    我正在开发一个应用程序 在其中创建了一个自定义列表视图 列表视图xml代码如下
  • 使用 Python 实现 AutoCAD 自动化

    我对 Python 和 AutoCAD 非常陌生 所以请耐心等待 我正在尝试使用 Python 来自动化 AutoCAD 中的设计周期 到目前为止 我可以通过 Python 在 AutoCAD 中添加点和线 但我希望能够将线型更改为虚线 我
  • 安全的原子文件复制操作

    我需要将文件从一个位置复制到另一个位置 如果文件已存在于目的地 不覆盖 我需要抛出异常 或至少以某种方式识别 我可以首先使用 os path exists 检查 但极其重要的是 不能在检查和复制之间的短时间内创建文件 是否有一种内置的方法可
  • 从 XBee 接收的 pySerial 数据未正确显示

    我正在尝试让多个 XBees 作为传感器和输出设备运行 以将其样本发送到按如下方式连接的协调器 XBee 并根据指示打开和关闭这些远程 XBees 上的开关 我的这个 收到数据 问题似乎与 Stack Overflow 问题类似pySeri