与Arduino的Android的蓝牙通信(Android bluetooth communicat

2019-10-19 14:26发布

我目前正在研究谷歌的蓝牙聊天的例子。 我们的目标是努力在此基础上例如Android和Arduino的和之间得到交流。

而从智能电话到Arduino通信工作很大,另一个方向不:当从阿尔杜伊诺发送字节数到智能电话,下面的代码被用于接收:

// Read from the InputStream
bytes = mmInStream.read(buffer);

// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget();

这有以下问题:

  • 在我的主要活动中,我得到一个递给字节数组总是1024个字节长。 不管是什么输入字节长度。 这将是非常好的,如果我有一个idication多少字节被接收。
  • 字节似乎并没有得到阅读的一次。 例如上面的代码被多次调用,但缓冲NEVER包含所有我从阿尔杜伊诺发送的字节数。 有时,仅仅是第一字节,后来只有最后一个字节。
  • 尽管此代码是卡列斯多次,我的主要活动,仅得到通知一次。 怎么可能?

什么是这样做的正确方法。 一个应该实现收集并连接字节的机制? 还是我使用此代码错误的方式?

Answer 1:

我一直有麻烦一次读取一个字节的缓冲区大于1。 这是因为没有办法保证你正确地接收所有字节。 我的工作就是四处打电话给在同一时间重复一个字节读取并填写我的缓冲区。 这样,如果我的任何字节不读坏抓在我的connectedThread的I / O卡脚部分,并可以选择来解决它,但是我想要的。

样品connectedThread

private class ConnectedThread extends Thread {
            private final BluetoothSocket mmSocket;
            private final InputStream mmInStream;
            private final OutputStream mmOutStream;

            public ConnectedThread(BluetoothSocket socket) {
                mmSocket = socket;
                InputStream tmpIn = null;
                OutputStream tmpOut = null;

                // Get the input and output streams, using temp objects because
                // member streams are final
                try {
                    tmpIn = socket.getInputStream();
                    tmpOut = socket.getOutputStream();
                } catch (IOException e) { }

                mmInStream = tmpIn;
                mmOutStream = tmpOut;
            }


            public void run() {
                byte[] buffer; // buffer store for the stream
                int bytes; // bytes returned from read()
                // Keep listening to the InputStream until an exception occurs
                while (true) {
                    try {
                        // Read from the InputStream
                       // You can define this buffer to be 1024 or anything you like
                        buffer = new byte[3];
                            mmOutStream.write(253);
                            bytes = mmInStream.read(buffer,0,1);
                            mmOutStream.write(254);
                            bytes = mmInStream.read(buffer,1,1);
                            mmOutStream.write(255);
                            bytes = mmInStream.read(buffer,2,1);
                            mHandler.obtainMessage(MESSAGE_READ, buffer).sendToTarget();
                        }
                        catch (IOException e) {
                            break;
                     }
                }
             }
            /* Call this from the main activity to send data to the remote device */
            public void write(byte[] bytes) {
                try {
                    mmOutStream.write(bytes);
                } catch (IOException e) { }
            }
        }

在这种情况下,我使用的无符号字节数组从0-255代表整数。 此外,我使用的值255-253的命令来告诉我的Arduino送我某些类型的信息。 您没有设置任何值来表示,以Arduino的命令,而不是你可以只告诉过值,它需要每次收到对信息的请求时发送的Arduino的循环。 我发现这是唯一的办法可以确认你接收的字节数量(即你的大小一个byte[] buffer )。虽然在这种情况下,我没有把任何东西在我的catch语句为connectedThread你可以把在那里读命令来确认收到一个字节。

消息处理程序

这里是我是如何处理readBuffer ...

/*
     * Bluetooth Handler Method
     */
    ConnectedThread connectedThread;
    Handler mHandler = new Handler(){           
        public void handleMessage(Message msg){
            super.handleMessage(msg);
            switch(msg.what){
                case SUCCESS_CONNECT:
                    // Do Something;
                    Toast.makeText(getActivity(),"CONNECTED",Toast.LENGTH_SHORT).show();

                    connectedThread = new ConnectedThread((BluetoothSocket)msg.obj);
                    listView.setVisibility(View.GONE);
                    connectedThread.start();
                    break;

                case MESSAGE_READ:
                    byte[] readBuf = (byte[])msg.obj;
                    int tempInt = byteToInt(readBuf[0]);
                    int speedInt = byteToInt(readBuf[1]);
                    int cadenceInt = byteToInt(readBuf[2]);

                    EditText temperatureData = (EditText)getActivity().findViewById(R.id.temperatureData);
                    temperatureData.setText(Integer.toString(tempInt) + " C" );
                    EditText cadenceData = (EditText)getActivity().findViewById(R.id.cadence);
                    cadenceData.setText(Integer.toString(cadenceInt) + " rpm");
                    EditText speedData = (EditText)getActivity().findViewById(R.id.speed_data);
                    speedData.setText(Integer.toString(speedInt) + " kph");

            }
        }       
    };

在这种情况下,我是我的手机上显示实时传感器数据。 但是你可以做任何事情。

希望帮助。



文章来源: Android bluetooth communication with Arduino