Котлин не получает полный пакет от модуля Bluetooth HC-06 - PullRequest
0 голосов
/ 06 ноября 2019

В Kotlin у меня проблема с данными, которые не полностью загружаются в буфер в Android в одном пакете. Я отправляю <7:16> пакет данных от модуля Bluetooth HC-06. Когда я получаю это приходит как 2 пакета. Микро посылает CR и LF и завершает передачу.

I/UI_Msg: <  
I/UI_Msg: 7:16>  
I/UI_Msg: <  
I/UI_Msg: 7:16>  
etc

Если я на секунду добавлю команду ожидания, то запросу буфера, в котором она завершена, в одном пакете. Проблема в том, что я хочу отправить более одного пакета в секунду.

Как я могу исправить эту проблему или просто построить строку, пока из буфера не будет получено '>'.

private fun beginListenForData() {
  val handler = Handler()
    stopThread = false
    buffer = ByteArray(10)
    val thread = Thread(Runnable {
        while (!Thread.currentThread().isInterrupted && !stopThread) {
            try {
                val byteCount = inputStream!!.available()
                if (byteCount > 0) {
                    //Thread.sleep(1000)      // wait for buffer finish filling
                    val rawBytes = ByteArray(byteCount)
                    inputStream!!.read(rawBytes)
                    val string = String(rawBytes, StandardCharsets.UTF_8)
                    //handler.post {txt_message.text=""}
                    Log.i(TAG,""+ string)
                    //handler.post {txt_message.append(string)}
                   // processInput(string)
                }
            } catch (ex: IOException) {
                stopThread = true
            }
        }

    })

    thread.start()

}

1 Ответ

0 голосов
/ 06 ноября 2019

выяснил это. Читайте буфер по одному байту за раз и строите символ строки за раз. Проверьте наличие символа <и> для правильной передачи

private fun beginListenForData() {

stopThread = false
val thread = Thread(Runnable {
    while (!Thread.currentThread().isInterrupted && !stopThread) {
        try {
            val byteCount = inputStream!!.available()
            if (byteCount > 0) {
                val rawBytes = ByteArray(1)
                inputStream!!.read(rawBytes,0,1)
                val string = String(rawBytes, StandardCharsets.UTF_8)
                if (string== "<") {
                    m_Headder=true
                }
                if (m_Headder==true){
                    stringBuilder = stringBuilder.plus(string)
                    if (string ==">") {
                        m_Received=stringBuilder
                        Log.i(TAG, "string:" + stringBuilder)
                        stringBuilder = ""
                        m_Headder = false
                        ProcessMessage(m_Received)
                   }
                }
            }
        } catch (ex: IOException) {
            stopThread = true
        }
    }

})
thread.start()

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...