手机蓝牙接收蓝牙模块发过来的图像数据只有第一帧能正常显示,之后的都不能完整显示

penge666 2016-05-28 12:52:45
蓝牙模块每隔0.5秒发送一帧图像数据过来,手机接收后保存为jpg图片,现在只能将进入线程后接收到的第一次数据完整保存为jpg图片,之后每一次的数据都是不全的,这是为什么?接收数据的部分程序如下
//存储文件并显示的线程
private class saveimageThread extends Thread {

public saveimageThread(BluetoothSocket btSocket) {
InputStream tmpIn =null;
inStream=null;

try {
tmpIn=btSocket.getInputStream();
} catch (IOException e) {
Log.e(TAG,"temp scoket not created",e);
}
inStream=tmpIn;
}
@Override
public void run() {
int picname=1;
Log.i("saveimage","start");
//保存图片
try{
byte[] buffer=new byte[50000];
//dri为保存路径,SD卡中的carImage文件夹
//从蓝牙获取输入流
while (inStream!=null)
{
Log.e("","InputStream");
int l = -1;
try{
while((l = inStream.read(buffer)) != -1)
//l = inStream.read(buffer);
{
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
outStream.write(buffer,0,buffer.length);
//inStream.close();
byte[] data = outStream.toByteArray();
Log.e("","data is ready!");
//后面都是对data数组进行处理m
while(data.length>0){

}
//break;
}
}catch (Exception e){
e.printStackTrace();}
break;
}

} catch (Exception e){
e.printStackTrace();
System.err.println("Can't start");
}
try {
sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}
...全文
561 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ink_s 2016-05-28
  • 打赏
  • 举报
回复
byte[] tt = new byte[3];//数据头3个字节(前2字节匹配,后一个字节说明后面数据长度)
					
					if (inStream != null) {
						for (int i = 0; i < 3; i++) {
							try {
								tt[i] = (byte) inStream.read();
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
						String aaa = Hex.encodeHexStr(tt);
						String huida = aaa.substring(0, 4);
						String dl = aaa.substring(4, 6);
						int ddll = Integer.parseInt(dl, 16);//得到数据长度
						byte[] tt2 = new byte[ddll];//读取长度的数据
						for (int i = 0; i < ddll ; i++) {
							try {
								tt2[i] = (byte) inStream.read();
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
ink_s 2016-05-28
  • 打赏
  • 举报
回复
你传数据的时候的写一个数据头,说明数据长度,读取的时候先读取数据头,得出数据长度,在读取数据长度大小的数据
ink_s 2016-05-28
  • 打赏
  • 举报
回复
byte[] buffer=new byte[50000]; 不能这样读
ink_s 2016-05-28
  • 打赏
  • 举报
回复
写个计算方法,每次发的时候计算一次长度,字节流是不能判断结束的。字节流是不能判断结束的。字节流是不能判断结束的。 所以你读到的数据分割就会出问题了显示不全那是因为数据不全,比如第一张图是11111,第二张是22222,第三张是33333,但是接收的可能会是第一张1111122;第二张2223;第3张3333 ;虽然他们加起来都是111112222233333!!!
penge666 2016-05-28
  • 打赏
  • 举报
回复
关键应该不是数据长度的问题吧,我不是特别懂,能解释一下吗?感觉关键是第一帧数据能正常接收,之后接收到的都是非完整的数据,有时候只显示图片的上边一点点,有时候接收完一张图片数据后就不在接收了,不知道会不会跟 BluetoothSocket 有关。循环接收的话不知道行不行,因为看谷歌的蓝牙通信程序都不是循环接收数据的。一开始看网上有人说是可以监听有数据传入的
反魂蝶五分 2016-05-28
  • 打赏
  • 举报
回复
摄像头拍完后的会得到一组data,你得到data.length,把长度放在第一位和data拼在一起传过去,那边读的时候读第一位得到长度,然后设 byte[] buffer=new byte[data.length]; buffer 就是图片的数据。
ink_s 2016-05-28
  • 打赏
  • 举报
回复
写个计算方法,每次发的时候计算一次长度,字节流是不能判断结束的。
penge666 2016-05-28
  • 打赏
  • 举报
回复
因为那个是摄像头模块自动发过来的数据,每一帧都是一张完整的jpg图像数据,所以每一次的数据长度应该都是不太一样,这个就不太好弄了,我现在就想直接在接收数据这块进行处理,图像数据就像是这样的

80,351

社区成员

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

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