`花了一天时间, 测试了一下PC与手机通过HC02模块收发文件.测试目的: PC端通过HC02将图片文件发送至安卓端, 并在APP中实时显示.
用到的资源如下:
1.HC02蓝牙模块与USB转TTL接口
2.PC一台,安卓手机一部
3.软件/文件
BTClient.apk 在官方提供的蓝牙通讯APK源码基础上修改, 增加图片框(初始时图片为一个安卓图标)
SerialPortTest 自己写的一个PC端的蓝牙通讯软件
capture.jpg 测试传送的图片文件(在HC02引脚图中截了一小块, 大小6KB)
测试流程如下:
1.手机启动BTClient, 并在已配对设备中点击HC-02进行连接
2.PC端打开程序, 选择串口号(本机Com5)并打开串口
3.手机端发送3次字符a至PC端以测试通讯
4.PC端设置待传输文件并点击发送按钮. 发送流程如下:
(1). 发送字符串ImageSendBegin,告之安卓端开始传输文件
(2). 读取图片文件, 每隔200ms传送100字节
(3). 传输完毕后, 发送字符串ImageSendEnd,告之安卓端文件传输完毕
(4). 安卓端将收到的字节数组转为图片对象并显示
测试过程发现如果PC端一次发送内容太多, 或者发送太快时, 安卓端会一次取290字节. 为避免数据丢失, 控制传输速度. 波特率9600时理论传输速度为1秒1.2KB左右, 实际测试中6KB图片用时12S. 如果改为115200波特率应该会提升很多.
关键代码:
PC端(C#):
byte[] begin = { 73, 109, 97, 103, 101, 83, 101, 110, 100, 66, 101, 103, 105, 110 },
end = { 73, 109, 97, 103, 101, 83, 101, 110, 100, 69, 110, 100 };
sp1.Write(begin, 0, begin.Length);
Thread.Sleep(200);
byte[] byteBuffer = File.ReadAllBytes(path);
Console.WriteLine("Max Len: " + byteBuffer.Length.ToString());
for (int i = 0; i < byteBuffer.Length; i = i + 100)
{
byte[] tmps = byteBuffer.Skip(i).Take(100).ToArray();
sp1.Write(tmps, 0, tmps.Length);
Console.WriteLine("i: " + i.ToString() + ", len: " + tmps.Length.ToString());
Thread.Sleep(200);
}
Thread.Sleep(200);
sp1.Write(end, 0, end.Length);
Android:
num = is.read(buffer); //读入数据
n=0;
String s0 = new String(buffer,0,num);
if(num==14 && "ImageSendBegin".equals(s0))
{
Log.d("MyBTTest", "Begin Rcv");
totalCount = 0;
imageContent = new byte[50000];
isRcvImage = true;
Message msg = handler3.obtainMessage();
msg.obj = "开始传输";
handler3.sendMessage(msg);
}
else if(num==12 && isRcvImage && "ImageSendEnd".equals(s0))
{
Log.d("MyBTTest", "End Rcv");
isRcvImage = false;
Message msg = handler3.obtainMessage();
msg.obj = "停止传输";
handler3.sendMessage(msg);
try {
Thread.sleep(2000);
}
catch (Exception e){
}
handler2.sendMessage(handler2.obtainMessage());
}
else if(isRcvImage)
{
Log.d("MyBTTest", "rcv: " + num);
System.arraycopy(buffer, 0, imageContent, totalCount, num);
totalCount += num;
}
Toast.makeText(getApplicationContext(), "Image Len: " + imageContent.length, Toast.LENGTH_SHORT).show();
if(imageContent.length > 0)
{
Bitmap bitmap = BitmapFactory.decodeByteArray(imageContent, 0, imageContent.length);
img.setImageBitmap(bitmap);
}
`
|