【问题标题】:XBee - XBee-API and multiple endpointsXBee - XBee-API 和多个端点
【发布时间】:2013-03-11 03:55:39
【问题描述】:

使用 Andrew Rapp 的 XBee-API,我如何通过协调器从两个以上的端点采样 I/O 数据?

我有 17 个系列 1 XBees。我已经将一个编程为协调器(API 模式 = 2),其余的编程为端点。使用 XBee-API 我正在发送一个强制 I/O 样本(“IS”)远程 AT 命令,单播到每个端点。这在最多有两个端点时效果很好,但是一旦添加了第三个端点,三个端点中的一个总是变得无响应(XBeeTimeoutException 超时)。停止响应的并非总是同一个物理单元,而是总是第三个​​(例如,如果我将 Force I/O Sample 发送到 Device1、Device2 和 Device3,Device3 将超时,如果我将顺序更改为Device3,Device1,Device2,Device2会超时。

如果我设置了三个以上的 XBees,大约三分之一的 XBees 会超时 - 但不是每三个。

我已验证 XBees 本身没有问题。我特别搜索了 Internet 和 StackOverflow,但无济于事。我尝试过使用简单的 ZNetRemoteAtRequest。我尝试为所有三个设备打开和关闭 XBee 协调器串行连接一次,每个设备一次,每个程序运行一次。我尝试改变协调器和端点之间的距离(相距不超过五英尺)。我尝试了不同的协调器配置参数(来自 Digi 文档)。我已经尝试为协调器更换 XBee。

这是我用来向每个端点发送 Force I/O Sample 请求并读取响应的代码:

xbee = new XBee(); // Coordinator
xbee.open("/dev/ttyUSB0, 115200)); // Happens before any of the endpoints are contacted

... // Loop through known endpoint addresses

XBeeRequest request = new ZBForceSampleRequest(new XBeeAddress64(endpointAddress));
ZNetRemoteAtResponse response = null;
response = (ZNetRemoteAtResponse) xbee.sendSynchronous(request, remoteXBeeTimeout);
if (response.isOk()) {
     // Process response payload
}

... // End loop and finally close coordinator connection

什么可能有助于从两个以上端点轮询 I/O 样本?

编辑:我发现 Andrew Rapp 的 XBee-API 库伪造了多线程行为,这导致了这个问题中描述的同步问题。我写了一个替换库,实际上是多线程的,并且正确地映射了来自多个 XBee 端点的响应:https://github.com/steveperkins/xbee-api-for-java-1-4。当我编写它时,Java 1.4 是在 BeagleBone、Plug 和 Zotac 单板 PC 上使用所必需的,但它很容易转换到 1.7+。

【问题讨论】:

    标签: rxtx xbee


    【解决方案1】:

    您是否在串行端口上使用硬件流控制?当本地 XBee 取消断言 CTS(例如,要求您停止发送)时,您是否有可能发送请求?我假设你的运行速度是 115200 bps,所以 XBee 串行端口可以跟上网络数据速率。

    能否打开调试信息,或者连接一些端口监控硬件/软件,将通过串口的数据显示到本地XBee?

    【讨论】:

    • 正在使用硬件流控制。本地 XBee 可能已经发送了停止字符,但它在到达我的代码之前先经过 rxtx,然后是 xbee-api。 xbee-api 似乎对此进行了管理,但是我使用该库的目的是避免了解诸如在什么时间发送哪些控制字节之类的事情-我的意思是我在这个级别上知之甚少。我正在设置一个测试,以准确收集每个请求中发送到本地 XBee 和从本地 XBee 返回的数据。一旦我有可用的数据,我会在这里更新。感谢您的建议。
    • 您无需担心串行流中的开始/停止字符——这将是软件流控制。你说得对,图书馆应该负责所有这些。如果有来自 XBee 的其他数据包由于某种原因没有通过库到达您的代码,这将很有帮助。
    • 我能够捕获发送到 XBee 的数据和 XBee 的响应。虽然我在 xbee-api 和 S1 XBees 上阅读的信息表明默认使用硬件流控制,但数据显示正在使用一个恒定的起始字节。通过删除 xbee-api 并直接使用 rxtx,我发现当向 XBee 发送请求时,串行输入似乎在发送完成之前就中断了串行输出 - 响应只是一个 -1 表示流结束.周末我会继续调查。
    • 再次检查您的波特率并使用 Digi 的 X-CTU 测试 XBee(如果您使用的是 Windows)。如果您不反对 C,您可以尝试编译 Digi 的 Open Source XBee ANSI C Host Library 来测试串行连接。它适用于 Win32 (MinGW/MSYS) 和 POSIX 系统。但请注意,它使用 API 模式 1。
    • 我已经仔细检查了波特率 - 在 XBee 上设置为 115200,在建立连接时也是如此。 C 不适合我,但我发现我认为是问题所在:xbee-api 通过使用线程同步来伪造同步 XBee 通信。它假设远程 XBees 将立即响应,而当它们不响应时,入站消息就会出现乱码。我可以通过放弃 xbee-api 并编写我自己的代码来向所有 XBees 发送请求并允许他们以他们希望的任何顺序响应来解决这个问题。我正在标记您的答案,因为我感谢您在故障排除方面提供的帮助。
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多