Может кто-нибудь объяснить мне, что не так со следующим кодом? Я перепробовал все: добавление лимита \n\r
для ожидания конца строки и несколько других способов. Я получаю мусорные данные всегда. Итак, я вернулся к своему стартовому коду.
Некоторые люди говорили мне, что это может быть InputStream
который не получает данные, но это не дает мне решения.
private class ConnectedThread extends Thread {
private final InputStream mmInStream;
// Creation of the connect thread
public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
try {
// Create I/O streams for connection
tmpIn = socket.getInputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
}
public void run() {
byte[] buffer = new byte[1024]; // I tried all 128, 8, 256
int bytes;
while (true) {
try {
if (mmInStream.available()>0){
bytes = mmInStream.read(buffer);//read bytes from input buffer
bluetoothIn.obtainMessage(handlerState, bytes, -1, buffer).sendToTarget();
}
}
catch (IOException e) {
break;
}
}
}
}
private void setw() throws IOException {
blue_tv = findViewById(R.id.blue_tv);
blue_tv2 = findViewById(R.id.blue_tv2);
bluetoothConnectDevice();
mConnectedThread = new ConnectedThread(bluetoothSocket);
mConnectedThread.start();
}
private void bluetoothConnectDevice() throws IOException {
try {
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
blue_address = bluetoothAdapter.getAddress();
pairedDevice = bluetoothAdapter.getBondedDevices();
if (pairedDevice.size() > 0) {
for (BluetoothDevice bt : pairedDevice) {
blue_address = bt.getAddress();
blue_name = bt.getName();
Toast.makeText(getApplicationContext(), "Cane connected", Toast.LENGTH_SHORT).show();
blue_status = "La canne est connectée !";
}
}
} catch (Exception e) {
e.printStackTrace();
}
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); //get mobile bluetooth device
BluetoothDevice bd = bluetoothAdapter.getRemoteDevice(blue_address);//connect to the device
bluetoothSocket = bd.createInsecureRfcommSocketToServiceRecord(myUUID); //create a RFCOM (SPP) connexion
bluetoothSocket.connect();
try {
blue_tv.setText("Bluetooth Name : " + blue_name + "\nBluetooth Adress : " + blue_address);
} catch (Exception e) {
e.printStackTrace();
}
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_traject);
mySR = SpeechRecognizer.createSpeechRecognizer(this);
autoCompleteTextView = findViewById(R.id.actv);
try {
setw();
}catch (Exception e){
e.printStackTrace();
}
blue_status = "La canne n'est pas connectée.";
bluetoothIn = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == handlerState) {
byte[] readBuff = (byte[]) msg.obj;
String readMessage = new String(readBuff,0,msg.arg1);
blue_tv2.setText("Data Received = " + readMessage+"\n"+"Data Length = "+readMessage.length());
}
}
};
Здесь нет ничего плохого. Я думаю, что вы получаете достоверные данные из HC05. Однако некоторые символы не могут быть напечатаны, так как Bluetooth отправляет вам данные в виде байтов, и каждый байт не может быть преобразован в действительный символ, пока вы пытаетесь установить их как текст в TextView
.
Я хотел бы предложить вам сначала обработать InputStream
прежде чем поместить его в TextView
. Например, прочитайте байты, полученные сначала в байтовом массиве, а затем создайте строку самостоятельно, как показано ниже.
public String toString() {
String print = "";
for (int i = 0; i < buffer.length; i++) print += " " + buffer[i];
return "Buffer (size=" + buffer.length + " content:" + print;
}