Bluetooth получает данные от HC05 не работает. Я получаю эти данные мусора ����

1

Может кто-нибудь объяснить мне, что не так со следующим кодом? Я перепробовал все: добавление лимита \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());

            }
        }
    };
Теги:
bluetooth

1 ответ

0

Здесь нет ничего плохого. Я думаю, что вы получаете достоверные данные из 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню