我有一个15秒的Timer Swing,它通过我的Coordinator API(XBee S2)将数据包发送到最多20个路由器AT。我通过SerialPortEvent(我正在使用RXTXcomm.jar库)接收所有数据包,我收到的每个数据包都存储在Buffer ArrayList中。 它们是两个不同的线程吗?我仍然有主GUI。
所以,我的问题是:向多个XBee模块发送和接收数据包的最佳方式是什么?我想两个替代方案,做一个for循环发送单播数据包到每个模块(最多20个),之后,验证我的缓冲接收器,如果我得到任何响应。我目前正在使用这种方法,但有时我会丢失数据包,可能是因为XBee是半双工并且我在发送的同时收到了这些数据?
另一种选择是发送单播数据包并等待每个数据包的响应。在那种情况下,我应该等待的超时响应是什么,以便不延迟我的计时器摆动(15秒)。我应该增加这15秒吗?
编辑:
我当前的超时时间为300毫秒,响应时间为450毫秒
答案 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>