Как отложить getOutputStream (). Write () в Android Studio? - PullRequest
2 голосов
/ 23 марта 2020

Я использую разъем Bluetooth для отправки информации с моего телефона на Arduino. Проблема в том, что btSocket.getOutputStream().write(bytes); отправляет информацию слишком быстро, и Arduino не может справиться с опустошением и переполнением. Код, запущенный на моем Arduino, замедляет способность Arduino получать информацию с телефона, и приемный буфер Arduino переполняется (входящие данные становятся ошибочными, поскольку буфер очищается гораздо медленнее, чем заполняется). Таким образом, решением было бы замедлить скорость, с которой телефон отправляет информацию.

Это функция, которую я использую для отправки информации с телефона на Arduino:

public void send_string_to_lim(String s) {
    if (btSocket != null) {
        try {
            byte[] bytes = s.getBytes();
            btSocket.getOutputStream().write(bytes);
        } catch (IOException e) {
            quick_toast("Error: " + e.toString());
        }
    }
}

И это как создается btSocket: (не уверен, нужен ли он для вопроса)

if (btSocket == null || !isBtConnected) {
    myBluetooth = BluetoothAdapter.getDefaultAdapter(); //get the mobile bluetooth device
    BluetoothDevice dispositivo = myBluetooth.getRemoteDevice(address); //connects to the device's address and checks if it's available
    btSocket = dispositivo.createInsecureRfcommSocketToServiceRecord(myUUID); //create a RFCOMM (SPP) connection
    BluetoothAdapter.getDefaultAdapter().cancelDiscovery();
    btSocket.connect(); //start connection
}

Как я могу замедлить btSocket.getOutputStream().write(bytes);, чтобы он отправлял информацию медленнее? Добавьте некоторый тип задержки, чтобы Arduino не переполнялся.

1 Ответ

0 голосов
/ 23 марта 2020

Вы отправляете байтовый массив в OutputStream, но вы также можете отправлять байты по одному - просто l oop через ваш байтовый массив, и после отправки каждого байта задержка на бит.

I ' Мы использовали AsyncTask для этого, но, поскольку он устарел, вы можете захотеть использовать потоки или что-то подобное, чтобы не блокировать ваш поток пользовательского интерфейса.

Как только у вас есть AsyncTask Framework или Thread, ваш рабочий код (который находится в doInBackground или ваша рабочая функция) должны выглядеть примерно так:

for (int i=0; i<bytes.length();i++)
{
    btSocket.getOutputStream().write(bytes[i]);
    Thread.sleep(2); //2 ms delay
}

Есть несколько исключений, которые я не обработал, но вы можете поместить их в блок try-catch для этого, если хотите.

Пример шаблона для AsyncTask (который, опять же, ваш выбор) находится здесь: { ссылка }. Я только поднимаю это, потому что это то, что я использовал, и это сработало для меня.

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