我有的
我有一个硬件传感器和一个连接到 Arduino 的 HC-05。Arduino 收集传感器数据并通过蓝牙 HC 05 将其实时传输到 Android 设备进行分析。
每帧传感器数据为 44 字节。
平均数据传输速率为每秒 2200 字节。
有一个定制的 Android 应用程序可以处理传感器数据。
问题
一旦 Android 应用程序连接到硬件数据流开始以正常速率流动,直到,Android 应用程序从应用程序向 Arduino 发送单个命令。之后,每隔几百帧就会观察到 450-950 毫秒的大延迟,然后才能接收到更多数据。
注意:此命令不会以任何方式影响上述功能。还有其他命令不时从 Android 手机发送到 Arduino。
其他观察
来自 Arduino 的数据似乎以正常速度运行,没有观察到滞后。
如果 Android 应用程序不发送任何命令,则只要执行分析(大约 12 分钟)就没有观察到延迟。
在任何一种情况下(有或没有滞后)都没有丢失/丢失/损坏帧。即所有数据都被发送和接收。
谁能帮我理解为什么会产生这种巨大的滞后?
如果需要任何信息,请发表评论,我很乐意提供。
PS Android端代码是标准的教科书的东西,一旦连接,有两个线程在运行,一个保持从InputStream轮询(读取)数据,另一个用于写入。两个线程仅用于一个目的(编写器线程几乎没有像预期的那样参与)。
相关代码:
连接后,从 InputStream 读取的线程
inner class ReaderThread : Thread("CBT_reader") {
private var bytesRead: Int = 0
private var buffer = ByteArray(2)
private lateinit var trimmedBuffer: ByteArray
override fun run() {
try {
while (true) {
bytesRead = mmInStream.read(buffer)
trimmedBuffer = ByteArray(bytesRead)
System.arraycopy(buffer, 0, trimmedBuffer, 0, bytesRead)
observer.notify(trimmedBuffer)
}
} catch (e: IOException) {
logger.logException(e)
logger.logw(e.message ?: "Read error")
tryDisconnect()
} catch (e2: InterruptedException) {
logger.logd("Reader has been interrupted")
}
}
fun abort() {
interrupt()
mmOutStream.close()
mmInStream.close()
btSocket.close()
}
}
作家线程,
inner class WriterThread : Thread() {
private val queue = LinkedBlockingQueue<ByteArray>()
fun putInQueue(b: ByteArray) {
queue.put(b)
}
override fun run() {
while (true) {
try {
mmOutStream.write(queue.take())
logger.logd("Data frame written")
} catch (e: IOException) {
//write failed
logger.logException(e)
logger.logw(e.message ?: "Write error")
tryDisconnect()
break
} catch (e2: InterruptedException) {
logger.logd("Writer has been interrupted")
break
}
}
}
fun abort() {
interrupt()
}
}