安卓蓝牙2.0,接收返回数据分段返回如何解决

min139753 2017-04-13 07:40:53
比如我发送个指令adc,返回的数据是4567812 但他总是分段返回 比如 45,678,12 。如何一次就得到个完整的字符串。大神在 哪里帮我解决下。我发个红包给他。
...全文
507 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ink_s 2017-04-20
  • 打赏
  • 举报
回复
引用 3 楼 min139753 的回复:
数据长度是无法确定的。兄弟 你这个蓝牙聊天。我早看过了。没有用啊,我要蓝牙串口助手 跟单片机油关系的
是,数据长度不确定的,但是你单片机还不知道自己每次要发几个字? 比如 我要说 你好 那我就会发个 0a 0b 02 你好 00 然后你问了个吃放了吗 我回答 我吃了 那我就会发个 0a 0b 03 我吃了 00 或者我会回答 我吃了你吃了吗 那我就会发个 0a 0b 07 我吃了你吃了吗 00 难道不行吗 ? 单片机 发个 0a 0b 07 我吃了你吃了吗 00 你 android端如果还是按你那种方法接收 当然还会接收成 可能是 0a, 0b 07 我,吃了你, 吗, 00. 这样一段一段的。 所以你接收端就要先接收3个直接 就能收到07 然后再收8个字节 收到 我吃了你吃了吗 00 然后一加起来 就是完整的 0a 0b 07 我吃了你吃了吗 00 下面是我写的socket 通行的部分代码,和蓝牙也一样。 它可以收聊天对话,收文件。他能区分出是文件还是聊天,对话的类容是多长,这类容是上一句的还是下一句的。都是根据协议来完成的 ] byte[]mode=new byte[13];//对话0 文件1 while (inputStream!= null) { for(int i=0;i<13;i++){ try { mode[i]=(byte)inputStream.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } String modestr =new String(mode); //传送的数据模式 0 对话 1 文件 try { //对话或文件 int modeCode = Integer.parseInt(modestr.substring(0, 1), 10); //对话或文件大小 long inLength = Long.parseLong(modestr.substring(1, 11), 10); //如果是文件的话文件名长度 int nameLength = Integer.parseInt(modestr.substring(11, 13), 10); byte[] fileName = new byte[nameLength]; byte[] mgs = new byte[new Long(inLength).intValue()];
 byte[]mode=new byte[13];//对话0  文件1  
  
            while (inputStream!= null) {  
                for(int i=0;i<13;i++){  
                    try {  
                        mode[i]=(byte)inputStream.read();  
                    } catch (IOException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
  
                    }  
                }  
                String modestr =new String(mode);  
                //传送的数据模式 0 对话  1 文件  
                try {  
                    //对话或文件  
                    int modeCode = Integer.parseInt(modestr.substring(0, 1), 10);  
                    //对话或文件大小  
                    long inLength = Long.parseLong(modestr.substring(1, 11), 10);  
                    //如果是文件的话文件名长度  
                    int nameLength = Integer.parseInt(modestr.substring(11, 13), 10);  
                    byte[] fileName = new byte[nameLength];  
                    byte[] mgs = new byte[new Long(inLength).intValue()];  
                    //设置buff缓存为512字节  
                    int inTime=(int)(inLength/512);  
                    int inTimeResidue=(int)(inLength%512);  
  
                    if (modeCode == 0) {  
                        for (int i = 0; i < inLength; i++) {  
                            try {  
                                mgs[i] = (byte) inputStream.read();  
                            } catch (IOException e) {  
                                // TODO Auto-generated catch block  
                                e.printStackTrace();  
                            }  
                        }  
  
                        reviceMgs = new String(mgs,"UTF-8");  
                        Log.e("收到数据", reviceMgs.toString());  
                        handler.sendEmptyMessage(1);  
                        //  ET_print.getText().append("\n"+new String(mgs));  
  
  
                    } else if (modeCode == 1) {  
                        for (int i = 0; i < nameLength; i++) {  
                            try {  
                                fileName[i] = (byte) inputStream.read();  
                            } catch (IOException e) {  
                                // TODO Auto-generated catch block  
                                e.printStackTrace();  
                            }  
                        }  
                        reviceName = new String(fileName,"UTF-8");  
                        Log.e("收到文件名", reviceName.toString());  
                     //   handler.sendEmptyMessage(1);  
                         dir = new File("/mnt/sdcard/WifiSocketDownload/"+reviceName);  
                        File file = new File("/mnt/sdcard/WifiSocketDownload");  
                        if (!file.exists()) {  
                            try {  
                                //按照指定的路径创建文件夹  
                                file.mkdirs();  
                                Log.e("创建文件夹成功",file.toString());  
                            } catch (Exception e) {  
                                // TODO: handle exception  
                                Log.e("创建文件夹失败","创建文件夹失败");  
                            }  
                        }  
                        if (!dir.exists()) {  
                            try {  
                                //在指定的文件夹中创建文件  
                                dir.createNewFile();  
                                Log.e("创建文件成功",dir.toString());  
                            } catch (Exception e) {  
                                Log.e("创建文件失败","创建文件失败");  
                            }  
                        }  
                    if(inTime>=0&&inTimeResidue>0) {  
                        byte[] buffer = new byte[512];  
                        reciveTime= 0;  
                        for (int i = 0; i < inTime + 1; i++) {  
                            for (int k = 0; k < 512; k++) {  
                                try {  
                                    buffer[k] = (byte) inputStream.read();  
                                } catch (IOException e) {  
                                    // TODO Auto-generated catch block  
                                    e.printStackTrace();  
                                }  
                            }  
                            writeFileSdcard(dir, buffer);  
                            handler.sendEmptyMessage(99);  
  
                        }  
  
                    }else if(inTime>=0&&inTimeResidue==0){  
  
                        byte[] buffer = new byte[512];  
                        reciveTime= 0;  
                        for (int i = 0; i < inTime ; i++) {  
                            for (int k = 0; k < 512; k++) {  
                                try {  
                                    buffer[k] = (byte) inputStream.read();  
                                } catch (IOException e) {  
                                    // TODO Auto-generated catch block  
                                    e.printStackTrace();  
                                }  
                            }  
                            writeFileSdcard(dir, buffer);  
                            handler.sendEmptyMessage(99);  
  
                        }  
                    }  
                        handler.sendEmptyMessage(98);  
                    }  
  
                }catch (Exception e){  
  
                }  
min139753 2017-04-19
  • 打赏
  • 举报
回复
做蓝牙串口通信助手的高手在哪里啊 谁帮我解决这个问题,最少100块红包。骗人不得好死。 大神快来啊
min139753 2017-04-17
  • 打赏
  • 举报
回复
大神在哪里啊
min139753 2017-04-14
  • 打赏
  • 举报
回复
数据长度是无法确定的。兄弟 你这个蓝牙聊天。我早看过了。没有用啊,我要蓝牙串口助手 跟单片机油关系的
幻影宇寰 2017-04-14
  • 打赏
  • 举报
回复
这个是因为流没读完导致的问题,我这里有个蓝牙聊天的,每次也是发送字符串信息,你可以看看有没有帮助https://github.com/xiaoyaoyou1212/BluetoothChat
ink_s 2017-04-14
  • 打赏
  • 举报
回复
请定好协议 请定好协议 请定好协议 比如 头 0a0b 数据长度07 数据4 5 6 7 8 1 2 校验 00 那么 在接收的地方,首先就是建一个3字节的buff 1 收到0a0b07 ,然后建一个第三个字节长度+1的buff2 ,收到4 5 6 7 8 1 2 00 然后合并buff1buff2 得到 0a0b07 4 5 6 7 8 1 2 00 这就是一包数据 你在根据头,校验码判断数据是否出错。

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧