В моем коде Arduino, который используется для отправки байтов через мой модуль Bluetooth HC-06, я создал простую программу, которая отправляет данные каждый раз, когда я нажимаю кнопку. Метод выглядит так:
// This is defined already for my Bluetooth device's pin locations on my board
// and baud rate at which it will run. Here's only the necessary part of my code.
SoftwareSerial.print("Hello World!");
В моем приложении Android я установил прослушиватель для входящих данных через устройство Bluetooth, когда оно подключено к нему. Все работает хорошо. Когда я запускаю метод из моего кода Arduino, байты отправляются и обрабатываются в моем коде Android, который выдает "Hello World!"
. Однако, когда мое устройство Bluetooth не сопряжено с моим устройством Android, и я по-прежнему активирую метод, число экземпляров байтов позднее отправляется в мое приложение Android, когда оно снова связывается, но это не должно делать, Предполагается только отправить новый экземпляр данных.
Вот пример:
Теперь оба устройства сопряжены, оба устройства Bluetooth и Arduino. Я запускаю метод, который отправляет "Hello World!"
в приложение Android, и он работает хорошо. Выходные данные просто "Hello World!"
, что означает, что приложение Android успешно считывает входящие данные с сопряженного устройства Bluetooth. Тем не менее, когда я отключаю устройство, например, запускаю метод 4 раза, но на этот раз устройство Bluetooth не имеет места назначения для байтов и что-то идет не так. Когда я соединяю его снова и запускаю метод. Я получаю 5 экземпляров байтов. Выходные данные выглядят так: "Hello World!Hello World!Hello World!Hello World!Hello World!"
. Причина, по которой я отправляю данные, когда мое устройство Bluetooth не сопряжено с каким-либо другим устройством, заключается в том, чтобы имитировать любые проблемы, касающиеся того, поступают ли данные или нет.
Вот два из, возможно, лучших решений, о которых я мог подумать (это может быть полезно для кого-то другого):
# 1 Я пытался читать данные с устройства Bluetooth в моем приложении Android при сопряжении следующим образом:
StringBuilder builder = new StringBuilder();
byte[] bData = new byte[1024];
while(mmInputStream.available() > 0) {
int read = mmInputStream.read(bData);
builder.append(new String(bData, 0, read, StandardCharsets.UTF_8));
}
Этот фрагмент кода также используется для чтения любых новых входящих данных, однако он не помогает, он только «удаляет» пару байтов. Я мог настроить поток для прослушивания любых существующих данных в течение n секунд, но решил этого не делать, поскольку это глупо и скучно. Дело не в этом.
# 2 Мне было предложено реализовать метод, чтобы определить, является ли устройство Bluetooth сопряженным или нет, с помощью определенных AT-команд, чтобы определить, как работает его светодиод. (Поскольку я использую это HC-06), но я все еще беспокоюсь, что при отправке данных может возникнуть временная проблема с подключением.
Почему это происходит и есть ли какое-то решение?