我正在使用 Firmata 协议,它允许您通过串行协议控制 Arduino。我正在使用侦听 DATA_AVAILABLE 事件的 SerialPortEventListener 读取传感器值。但是我注意到我的应用程序注册更新的传感器值需要一秒钟的延迟,协议以 57600 的波特率运行。我的问题是事件侦听器是在单独的线程上运行还是我的应用程序和侦听器在同一个线程中运行,我的应用程序减慢了速度。
编辑:为了让我自己清楚,我只是在理论上问在单独的线程中读取串行传输或使用事件侦听器会更快吗?
我正在使用 Firmata 协议,它允许您通过串行协议控制 Arduino。我正在使用侦听 DATA_AVAILABLE 事件的 SerialPortEventListener 读取传感器值。但是我注意到我的应用程序注册更新的传感器值需要一秒钟的延迟,协议以 57600 的波特率运行。我的问题是事件侦听器是在单独的线程上运行还是我的应用程序和侦听器在同一个线程中运行,我的应用程序减慢了速度。
编辑:为了让我自己清楚,我只是在理论上问在单独的线程中读取串行传输或使用事件侦听器会更快吗?
对不起所有这些答案,我正在认真考虑你的问题。
除了从错误线程更新 GUI 的问题外,线程问题可能与此无关。由于从您的串行端口获取更新可能不会消耗大量 CPU 功率(它不应该,无论如何,除非它是通过紧密的轮询循环完成的),因此您的线程之间不会有任何明显的 CPU 资源争用,并且所以线程应该不可能“相互减速”。我几乎不考虑这种可能性。但是你可以在 TaskManager (Windows) 或 System Monitor (Linux) 中查看你的 CPU 是否真的很忙;这可能会改变事情。
没有看到您的应用程序,我不得不猜测;但是您是否有可能尝试在 GUI 中显示这些事件,并从 Event Dispatch Thread 以外的线程更新 GUI?
当你简单地做的时候延迟如何System.out.println()
?
另一个猜测:当你得到你的DATA_AVAILABLE
事件时,你是否也得到了一些关于有多少数据可用的信息?
您可能正在尝试读取比缓冲区中更多的数据,并且在您的读取操作超时之前您无法看到您得到了什么。这表明超时设置为 1 秒。