Не могу прочитать полученные данные по Bluetooth - PullRequest
0 голосов
/ 15 мая 2019

Я не могу прочитать данные, полученные через Bluetooth от Arduino Uno, но я знаю, что Arduino отправляет мне что-то.

Я получил ошибку:

W/System.err:     at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:537)
    at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
    at java.io.InputStream.read(InputStream.java:101)
    at bikit.chaptal.MainDisp$SendReceive.run(MainDisp.java:250)
    at bikit.chaptal.MainDisp$SendReceive.<init>(MainDisp.java:239)
    at bikit.chaptal.MainDisp$ConnectBT.doInBackground(MainDisp.java:200)
    at bikit.chaptal.MainDisp$ConnectBT.doInBackground(MainDisp.java:168)
    at android.os.AsyncTask$2.call(AsyncTask.java:345)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:784)
java.io.IOException: bt socket closed, read return: -1
    at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:537)
    at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96)
    at java.io.InputStream.read(InputStream.java:101)
    at bikit.chaptal.MainDisp$SendReceive.run(MainDisp.java:250)
    at bikit.chaptal.MainDisp$SendReceive.<init>(MainDisp.java:239)
    at bikit.chaptal.MainDisp$ConnectBT.doInBackground(MainDisp.java:200)
    at bikit.chaptal.MainDisp$ConnectBT.doInBackground(MainDisp.java:168)
    at android.os.AsyncTask$2.call(AsyncTask.java:345)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:257)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
    at java.lang.Thread.run(Thread.java:784)
java.io.IOException: bt socket closed, read return: -1

Вот часть кода, которая имеет проблему:

public  class SendReceive extends Thread
{
    private InputStream inputStream;
    private OutputStream outputStream;

    public SendReceive ( BluetoothSocket socket )
    {
        try {
            inputStream = mmSocket.getInputStream();
            outputStream = mmSocket.getOutputStream();
        }catch (IOException e ) {
            e.printStackTrace();
        }
        if(inputStream != null){
            run();
        }
    }

    public  void run()
    {
        byte[] buffer = new byte[1024];
        int bytes;

        while (true) {
            try {
                bytes = inputStream.read(buffer); 
                handler.obtainMessage(STATE_MESSAGE_RECEIVED, bytes, -1,buffer).sendToTarget();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    public void write (byte[] bytes)
    {
        try {
            outputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Обработчик:

Handler handler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {

        switch (msg.what)
        {
            case STATE_MESSAGE_RECEIVED:
                byte[]readBuff = (byte[]) msg.obj;
                if (bytes == 1){
                    Nbatt = readBuff[0];
                    bytes++;
                }
                else if (bytes == 2){
                    tempfloat = ByteBuffer.wrap(new byte[]{readBuff[1]}).getFloat();
                    temp = Float.toString(tempfloat);
                    resetbytes();   //bytes++;
                }
                else if (bytes == 3){
                    speed = readBuff[2];
                    resetbytes();
                }
                break;
        }
        return false;
    }
});

Приложение должно считывать разные байты и отображать их. Я не понимаю ошибку, может кто-нибудь объяснить мне?

1 Ответ

0 голосов
/ 15 мая 2019

Без глубокого анализа кода мы видим, что проблема вызвана операцией InputStream.read(), вызванной IOException, а именно следующей: bt socket closed, read, поэтому похоже, что соединение каким-то образом разорвано. Согласно некоторым форумам, это потому, что библиотека устарела, а с Android 4.2 стек BT изменился.

В любом случае, существует обходной путь, чтобы заставить его работать, создавая резервную копию при появлении этого исключения: IOException: чтение не удалось, сокет может быть закрыт - Bluetooth на Android 4.3

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