Поток чтения для последовательной связи USB между Android и Arduino Uno - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь установить связь между Arduino UNO и моим Android-смартфоном, используя USB Host API для Android.Пока все хорошо.Я посылаю тестовую строку «Try data» из моего Arduino через функцию Serial.print () каждую секунду.Скорость передачи данных установлена ​​на 9600 для обоих устройств.Android-смартфон выступает в роли хоста.

Некоторые учебные пособия, которые я использовал:

http://android.serverbox.ch/?p=549

http://android -er.blogspot.in / 2014/09 / send-data-from-android-to-arduino-uno.html

вместе с документацией по хосту android usb.Я пробовал physoid и другую библиотеку от mik3y, но они не работают.Устройство не открывается в обоих случаях.

Я использую поток, через который я получаю данные от Arduino (весь код ниже находится в onCreate ()

val reader = object : Thread(){
        override fun run() {
            var buf = ByteArray(endpointIn.maxPacketSize)
            connection.bulkTransfer(endpointIn, buf, buf.size, 0)
            tv.text = String(buf)//tv is the id of a textview 
        }
    }
 reader.start()

Проблема в том, чтоиз тестовой строки принимается только буква T. Если вместо этого я перемещаю объявление buf из класса потока, читаются только 4 символа. Я не могу понять, почему читаются только ограниченные символы. Если я вместопоследние 2 строки кода метода run в бесконечном цикле while, приложение вылетает (не в состоянии понять, почему). Я знаю, что потоки, кажется, работают одновременно, но на самом деле это основной поток, работающий в течение некоторого времени, а затемЧитатель, оба они не работают одновременно. Это очень быстрый переход, и поэтому они выглядят так, как будто они работают одновременно. Может ли это быть причиной того, что некоторая информация теряется?

Пожалуйста, помогите в написании кода для читательской ветки или есть ли лучший способ сделать это?

Спасибо, яn заранее

1 Ответ

0 голосов
/ 31 мая 2018

Наконец, спустя много времени, я понял это.Телефон Android не читает 64 байта при каждой групповой передаче, даже если параметр в вызове функции равен 64. Это происходит потому, что поток выполняется намного быстрее.Читается иногда 4, иногда 2 байта.Решение: используйте кольцевой буфер или просто используйте метод substring (), чтобы получить соответствующие символы.Модифицированный код выглядит так:

val reader = object : Thread(){
        override fun run() {
            var buf = ByteArray(64)
            while(true){
                var len = connection.bulkTransfer(endpointIn, buf, buf.size, 0)
                if(len > 0) {
                    val msg = String(buf) 
                    tvAppend(msg.substring(0, len)) //tv is the textview inside sv
                    sv.fullScroll(View.FOCUS_DOWN) //sv is a scrollview
                }
            }
        }
    }
reader.start()
...