Попытка понять поведение передачи данных (задержка) в соединении BlueTooth с использованием платы HC-05 (подключенной к Arduino) - PullRequest
0 голосов
/ 21 ноября 2018

Что у меня есть

У меня есть аппаратный датчик и HC-05, подключенный к Arduino.Arduino собирает данные датчиков и передает их в режиме реального времени по Bluetooth 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()

    }
}
...