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