Код: Выделить всё
#include
const int BT_RX_PIN = 15; // SoftwareSerial RX
const int BT_TX_PIN = 17; // SoftwareSerial TX
SoftwareSerial BTserial(BT_RX_PIN, BT_TX_PIN);
const unsigned long btSendIntervalMs = 100;
unsigned long lastBtSendTime = 0;
void setup() {
BTserial.begin(9600);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastBtSendTime >= btSendIntervalMs) {
sendBluetoothData();
lastBtSendTime = currentTime;
}
}
void sendBluetoothData() {
int Rand1 = random(10000);
int Rand2 = random(10000);
BTserial.print('$');
BTserial.print(String(Rand1));
BTserial.print('#');
BTserial.print(String(Rand2));
BTserial.print('&');
BTserial.println(); // Newline at the end
}
< /code>
Отправка двух случайных чисел, а не много данных, верно? Я намеренно разбиваю их для каждого вызова печати вместо того, чтобы помещать все в одну строку. < /P>
На моем компьюте />[youtube]hgb8pcww7iq[/youtube]
выглядит так, как будто он отправляет довольно небольшое количество байтов [b] без [/b] loce Latency (100 мс в этом случае, как определено пользователем)
Однако я. BufferedReader
private static BluetoothDevice btDevice;
private static BluetoothSocket btSocket;
private static InputStream mmInputStream;
private static BufferedReader bufferedReader;
static boolean connect(BluetoothDevice device) {
try{
if(btAdapter == null) {
Toast.makeText(CurrentContext.get(), "Bluetooth Adapter not found...", Toast.LENGTH_LONG).show();
return false;
}
else if(!btAdapter.isEnabled()) {
Toast.makeText(CurrentContext.get(), "Bluetooth Adapter is not enabled...", Toast.LENGTH_LONG).show();
return false;
}
if(btSocket != null && btSocket.isConnected()) {
if(btDevice == null) {
Toast.makeText(CurrentContext.get(), "Bluetooth Device could not be found...", Toast.LENGTH_LONG).show();
return false;
}
else {
Toast.makeText(CurrentContext.get(), "Already connected to: " + btDevice.getName(), Toast.LENGTH_LONG).show();
return false;
}
}
Toast.makeText(CurrentContext.get(), "Connecting. Please wait...", Toast.LENGTH_LONG);
btDevice = device;
if(btDevice == null) {
Toast.makeText(CurrentContext.get(), "Bluetooth Device could not be found...", Toast.LENGTH_LONG).show();
return false;
}
btSocket = btDevice.createRfcommSocketToServiceRecord(CONNECTION_UUID);
if(btSocket == null) {
Toast.makeText(CurrentContext.get(), "Bluetooth Socket could not be found...", Toast.LENGTH_LONG).show();
return false;
}
btAdapter.cancelDiscovery();
btSocket.connect();
mmInputStream = new DataInputStream(btSocket.getInputStream());
bufferedReader = new BufferedReader(new InputStreamReader(mmInputStream, StandardCharsets.UTF_8)); // Ignore error
beginInputStreamListener(); // Start the thread for reading data
}catch(Exception e){
e.printStackTrace();
Toast.makeText(CurrentContext.get(), "Could not connect to: " + device.getName(), Toast.LENGTH_LONG).show();
return false;
}
Toast.makeText(CurrentContext.get(), "Connected to: " + btDevice.getName(), Toast.LENGTH_LONG).show();
return true;
}
< /code>
А вот отдельный поток, который я вызываю через begininptristerlistener < /code>, чтобы непрерывно считывать данные.
Я хочу избежать использования его в потоке пользовательского интерфейса по всем затратам. < /p>
private static void beginInputStreamListener(){
dataListenerThread = new Thread(new Runnable() {
@Override
public void run() {
dataListenerThreadActive = true; // Just a boolean I can switch to terminate the loop below
while(!Thread.currentThread().isInterrupted() && dataListenerThreadActive) {
try {
if(bufferedReader.ready()) {
String line = bufferedReader.readLine();
if(line != null) {
Log.d("RECEIVED_DATA", line);
}
}
Thread.sleep(10); // Some small delay
} catch (IOException | InterruptedException e) {
Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(CurrentContext.get(), "An unresolved problem occured...", Toast.LENGTH_LONG).show();
}
});
e.printStackTrace();
dataListenerThreadActive = false;
reset();
}
}
}
});
dataListenerThread.start();
}
< /code>
Я пробовал разные подходы с чтением байто-байтового с .READ (), .aiLable () и т. Д. И они должны работать мгновенно в любом случае, но в конце концов, так как я отправляю строку за линию, что это может решить проблему. Но это не так!
По какой-то причине, когда я подключаю приложение к своему HC-05 (устройство Arduino), оно начинает печатать довольно быстро, как в замазке (как я хочу, чтобы оно работало!), Но через 5 секунд, четко работая правильно, у него есть какая-то задержка, затем напечатает 10 строк за один ход, затем задерживается второй или два, затем напечатает 10 или n, а не в непрерывном целом, просто в целом). Это чрезвычайно разочаровывает, так как я не транслирую видео 4K через это, но посылаю абсолютно мелкие данные, которые хорошо работают на Putty. /> Arduino должен постоянно отправлять данные каждые 100 мс и не должен ждать какой-либо команды.>
Подробнее здесь: https://stackoverflow.com/questions/796 ... -and-andro