概述:
手机端打开编写的蓝牙通信软件,与单片机端蓝牙串口模块连接,而后,手机通过蓝牙发送读数据命令到单片机,单片机开始读取传感器信息,
将采集到得传感器信息通过蓝牙发送到手机端,手机端软件接收到后,显示。
整体图:
焊接板图:
本项目涉及四个部分。
一、手机端软件
二、单片机端编程
三、外设电路设计
四、手机与单片机通信
下面对四个部分进一步叙述。
1、手机端软件
手机端软件为安卓软件,只需要编写一个普通的蓝牙串口调试软件即可。但在编写手机端按安卓软件时,我利用一年前做安卓手机通
过蓝牙远程控制指纹识别器的源码改进,但却始终不能接收到蓝牙串口模块发送的数据。也就是说,手机可以给下位机发送信息,下位机成功接收,
但是却接收不到下位机上传的信息。我很是疑惑,我以为是蓝牙串口模块的问题,于是换了一个,结果还是一样。我一直坚信去年的源码没有问题,
但是却查不出原因在哪里。于是,我在相应的安卓蓝牙编程的书本上,找到讲解蓝牙部分的章节,按照步骤重新编写带代码,结果双向通信可以调通。
先前的问题正在研究之中,下面是正常运行源码中的部分代码:
(1)蓝牙连接代码
//接收活动结果,响应startActivityForResult()
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case REQUEST_CONNECT_DEVICE: //连接结果,由DeviceListActivity设置返回
// 响应返回结果
if (resultCode == Activity.RESULT_OK) { //连接成功,由DeviceListActivity设置返回
// MAC地址,由DeviceListActivity设置返回
String address = data.getExtras()
.getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);
// 得到蓝牙设备句柄
_device = _bluetooth.getRemoteDevice(address);
// 用服务号得到socket
try{
_socket = _device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));
}catch(IOException e){
Toast.makeText(this, "连接失败!", Toast.LENGTH_SHORT).show();
}
//连接socket
Button btn = (Button) findViewById(R.id.Button03);
try{
_socket.connect();
Toast.makeText(this, "连接"+_device.getName()+"成功!", Toast.LENGTH_SHORT).show();
btn.setText("断开");
}catch(IOException e){
try{
Toast.makeText(this, "连接失败!", Toast.LENGTH_SHORT).show();
_socket.close();
_socket = null;
}catch(IOException ee){
Toast.makeText(this, "连接失败!", Toast.LENGTH_SHORT).show();
}
return;
}
//打开接收线程
try{
is = _socket.getInputStream(); //得到蓝牙数据输入流
}catch(IOException e){
Toast.makeText(this, "接收数据失败!", Toast.LENGTH_SHORT).show();
return;
}
if(bThread==false){
ReadThread.start();
bThread=true;
}else{
bRun = true;
}
}
break;
default:break;
}
}
(2)手机蓝牙发送数据代码
//发送数据线程
public class SendThread extends Thread{
public void run(){
int i=0;
int n=0;
try{
OutputStream os = _socket.getOutputStream(); //蓝牙连接输出流
byte[] bos = edit0.getText().toString().getBytes();
for(i=0;i
(3)手机蓝牙接收数据代码
//接收数据线程
Thread ReadThread=new Thread(){
public void run(){
int num = 0;
byte[] buffer = new byte[1024];
byte[] buffer_new = new byte[1024];
int i = 0;
int n = 0;
bRun = true;
//接收线程
while(true){
try{
while(is.available()==0){
while(bRun == false){}
}
while(true){
num = is.read(buffer); //读入数据
n=0;
String s0 = new String(buffer,0,num);
fmsg+=s0; //保存收到数据
for(i=0;i
2、单片机端
单片机采用Arduino开发板,因其简单易学。
单片机端的代码比较简单,是一些对应的传感器采集数据代码和串口通讯代码。
3、外设焊接。
外设有两个传感器,一个蓝牙串口模块。
蓝牙串口模块负责蓝牙通信,传感器负责采集信息。
4、手机与单片机通信
首先,约定一个命令 符,当单片机端接收到手机端发送的命令符时,即开始采集传感器信息,将采集到得信息进行加工,然后传给
安卓手机。安卓手机接收数据后,随即显示出来。
做成此项目用了三天时间,其中两天时间纠结与蓝牙单向通信问题,一直没有眉目。
剩下一天用半天调通手机端蓝牙串口调试软件,半天焊接电路板,写Arduino端程序,连接布线等。