0

我有的

我有一个硬件传感器和一个连接到 Arduino 的 HC-05。Arduino 收集传感器数据并通过蓝牙 HC 05 将其实时传输到 Android 设备进行分析。

每帧传感器数据为 44 字节。

平均数据传输速率为每秒 2200 字节。

有一个定制的 Android 应用程序可以处理传感器数据。


问题

一旦 Android 应用程序连接到硬件数据流开始以正常速率流动,直到,Android 应用程序从应用程序向 Arduino 发送单个命令。之后,每隔几百帧就会观察到 450-950 毫秒的大延迟,然后才能接收到更多数据。

注意:此命令不会以任何方式影响上述功能。还有其他命令不时从 Android 手机发送到 Arduino。


其他观察

  1. 来自 Arduino 的数据似乎以正常速度运行,没有观察到滞后。

  2. 如果 Android 应用程序不发送任何命令,则只要执行分析(大约 12 分钟)就没有观察到延迟。

  3. 在任何一种情况下(有或没有滞后)都没有丢失/丢失/损坏帧。即所有数据都被发送和接收。

谁能帮我理解为什么会产生这种巨大的滞后?

如果需要任何信息,请发表评论,我很乐意提供。

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()

    }
}
4

0 回答 0