本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车。界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信。

  SPP-CA模块自带代码,在这里我使用的全部都是SPP-CA的默认模式。其中波特率是9600。读者若要修改其匹配密码,波特率等请使用串口调试工具对SPP-CA使用AT命令进行修改。详情参考其技术手册。

  首先介绍Android端,官方的SDK中给了一个BluetoothChat的版本,这个版本稍加修改就可以进行串口通信。由于源代码网上随处可查,这里不加复制。修改方法如下:​

  首先​修改UUID,在Android系统中,与手机通信的UUID和与蓝牙串口通信的UUID是不同的。手机通信可以使用生成的UUID进行通信,但与蓝牙串口不可,需使用下面的UUID。(位置:BluetoothChatService.java)

1 private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");​

  在这里,如果其他的resource文件全部添加完毕并正确后之后,是可以正常运行不会产生致命错误的。​但是要注意一个地方,在BluetoothChat的文件中,它所使用的connect和discovery的按钮是在菜单中实现的。现在Android系统中普遍在取代菜单键这个功能,所以可能会出现部分小白发现没有这两个按钮的情况,不知道如何跳转到BluetoothConnect.java这个界面。解决方法:可以设置一个按钮,按钮按下,跳出菜单。跳出菜单代码如下:

BluetoothChat用于蓝牙串口通信的修改方法-LMLPHP
 1     ​menuButton.setOnClickListener(new OnClickListener() {
2
3 @Overridepublic
4
5 void onClick(View v) {
6
7 openOptionsMenu();
8
9 }
10
11 });
BluetoothChat用于蓝牙串口通信的修改方法-LMLPHP

  

  最后介绍一个重要问题。在手机端我没有进行测试,不过网上绝大部分我能找到的用来进行手机蓝牙通信的博客都没有标明这个错误​,应该是手机之间不会出现这个错误。但是,同样的代码用于蓝牙串口通信就会有乱码!!就会有乱码!!就会有乱码!!

这个乱码有时是出现在末尾,或者是一串字符传过来,就只显示了最后一个字符等等奇奇怪怪的神奇现象。这个现象在我仔细研究了他的BluetoothChatService中的run()方法并结合网上的博客之后发现了问题。​

这个问题是由InputStream这个类导致的。它的读取方法是,每次循环都将InputStream中的所有字符读出来。但是在蓝牙串口通信时,它有可能导致一句话没有传完,就已经被读取出来。所以会出现衔接和乱码等问题。

以下是解决办法:​通过available方法来得知InputStream中的字符串个数,由于我的需求每次传一个字符就可以,所以我这里buffer是char[1],在接收完成后,把available减去相应的字符串个数即可。

BluetoothChat用于蓝牙串口通信的修改方法-LMLPHP
 1 public void run() {
2 System.err.println("++++++++++run Thread+++++++++++++++++++++++");
3 int bytes; // bytes returned from read()
4 int availableBytes = 0;
5 // Keep listening to the InputStream until an exception occurs
6 while (true) {
7 try {
8 availableBytes += mmInStream.available();
9 if(availableBytes > 0){
10 byte[] buffer = new byte[1];
11 // buffer store for the stream
12 // Read from the InputStream
13 bytes = mmInStream.read(buffer);
14 availableBytes--;
15 // Log.d("mmInStream.read(buffer);", new String(buffer));
16 if( bytes > 0 ){
17 // Send the obtained bytes to the UI activity
18 mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
19 }
20 }
21 } catch (IOException e) {
22 Log.d("Error reading", e.getMessage());
23 e.printStackTrace();
24 break; }
25
26 }
27 }
BluetoothChat用于蓝牙串口通信的修改方法-LMLPHP

  以上就是完整的BluetoothChat修改方法。已经通过串口调试工具验证,发送接受都无问题。​

  本人第一次更新博客,如有不足敬请指出。

05-08 15:34