如何正确地在Java中发送和接收多个XBee数据包

时间:2014-07-08 12:49:05

标签: java swing xbee

我有一个15秒的Timer Swing,它通过我的Coordinator API(XBee S2)将数据包发送到最多20个路由器AT。我通过SerialPortEvent(我正在使用RXTXcomm.jar库)接收所有数据包,我收到的每个数据包都存储在Buffer ArrayList中。 它们是两个不同的线程吗?我仍然有主GUI。

所以,我的问题是:向多个XBee模块发送和接收数据包的最佳方式是什么?我想两个替代方案,做一个for循环发送单播数据包到每个模块(最多20个),之后,验证我的缓冲接收器,如果我得到任何响应。我目前正在使用这种方法,但有时我会丢失数据包,可能是因为XBee是半双工并且我在发送的同时收到了这些数据?

另一种选择是发送单播数据包并等待每个数据包的响应。在那种情况下,我应该等待的超时响应是什么,以便不延迟我的计时器摆动(15秒)。我应该增加这15秒吗?

编辑:

我当前的超时时间为300毫秒,响应时间为450毫秒

3 个答案:

答案 0 :(得分:2)

利用来自XBee的传输状态数据包,通知您是否在每个路由器的无线电层接收到数据包。如果应用层的路由器ACK不包含任何其他信息,则可以将其消除以减少网络流量。

您应该可以将每个帧发送到路由器并跟踪哪些ACK,然后重新发送第一遍中未确认的帧。只要您在协调器上使用硬件流控制来监视XBee模块的串行缓冲区的状态,您就应该没问题。如果XBee丢弃CTS,则需要立即停止发送字节。

XBee与具有全双工的主机通信,但网络上一次只能发送一个无线电(类似于以太网)。 XBee模块将管理入站/出站数据包。

最后,确保您的主机以115,200 bps(或更快)与XBee模块通信。使用默认值9600 bps是低效的,并且会增加主机确认数据包所需的时间。

答案 1 :(得分:1)

SwingWorker是处理此问题的最佳方法。在工作人员的doInBackground()实施,publish()中期结果中执行所有串行端口访问,并在EDT上执行process()结果。检查了一个相关的例子here。如果需要,您可以管理多个工作人员,如here所示。

答案 2 :(得分:0)

同步您的发送方法,避免及时发送数据包。

这对我来说使用这个库

    <dependency>
        <groupId>com.rapplogic</groupId>
        <artifactId>xbee-api</artifactId>
        <version>0.9</version>
    </dependency>