安卓手机通过蓝牙与单片机通信

2019-04-15 18:11发布

        概述:            手机端打开编写的蓝牙通信软件,与单片机端蓝牙串口模块连接,而后,手机通过蓝牙发送读数据命令到单片机,单片机开始读取传感器信息, 将采集到得传感器信息通过蓝牙发送到手机端,手机端软件接收到后,显示。        整体图:                        焊接板图:      

        本项目涉及四个部分。    一、手机端软件    二、单片机端编程    三、外设电路设计    四、手机与单片机通信      下面对四个部分进一步叙述。   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端程序,连接布线等。