Android通过蓝牙与单片机 HC-05 进行通信,接收数据

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

怕忘

蓝字是链接,打开会有更多惊喜。

  • 首先,可以明确的是,与单片机进行通信的时候,会很明确的知道是有多少个数据;
    所以我们就可以根据其长度设置要存取的byte[]长度;
  • 其次,蓝牙的接收和发送试药建立在独立线程里面的;
    搜索和配对/通信(后来在某篇博客里面发现,说是和单片机通信的话可以直接连接,完了可以试试)
  • 再之,就是和单片机通信的时候,它发送的都是16进制的东西,所以要么转换,要么直接用byte[];
  • 最后,读取的时候,InputStream有read(),read(byte[] b),read(byte[] b,int off,int len),可以参考↓使用;
    read()和read(byte[] b)
    read(byte[] b,int off,int len)
        while(true){
                        try {
                                num = inputStream.read(buffer_z);//buffer_z和buffer_z_new都是1024
                                n=0;
                                for(i=0;i<num;i++){
                                    buffer_z_new[n] = buffer_z[i];
                                    n++;
                                }
                                String s =bytesToHexString(buffer_z_new);//因为单片机发出的是16进制的,直接读取会是乱码,于是进行了转换。
                                smsg+=s.trim();
                                if(inputStream.available()==0)break;//有时候会因为某些原因,会出现有数据但是位0的问题,可以尝试添加延时;
                            } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
public static String bytesToHexString(byte[] bytes) {
        String result = "";
        for (int i = 0; i < bytes.length; i++) {
            String hexString = Integer.toHexString(bytes[i] & 0xFF);
            if (hexString.length() == 1) {
                hexString = '0' + hexString;
            }
            result += hexString.toUpperCase();
        }
        return result;
    }

但是以上读取的时候,有时候会出现丢包的现象,后来再百般询问,浏览之后,得到的结论是:
如果ble需要对事件广播进行监听;如果只是普通蓝牙直接使用接口函数即可,但是需要使用循环(for)不断读一个字节的函数,不能直接读一串。

比如:

            int i = 0,size = 0;
            byte[] oneByte = new byte[1];
            for(i = 0; i< 64386;i++){
                //读后面所有数据
                size = inputStream.read(oneByte, 0, 1);
                if (size != 1)
                {
                    return;
                }

                bufData[i] = oneByte[0];//将循环出来的每一个字节存放在总byte[]里面。
            }
  • 如果出现大量的0的时候,可以尝试让线程sleep一下。

以上。

点这里可以跳转到人工智能网站

发表评论