BluetoothChat用于蓝牙串口通信的修改方法
本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车。界面只用了一个小时就写好了,重要的问题是如何与板子所带的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这个界面。解决方法:可以设置一个按钮,按钮按下,跳出菜单。跳出菜单代码如下:

1 menuButton.setOnClickListener(new OnClickListener() {
2
3 @Overridepublic
4
5 void onClick(View v) {
6
7 openOptionsMenu();
8
9 }
10
11 });

最后介绍一个重要问题。在手机端我没有进行测试,不过网上绝大部分我能找到的用来进行手机蓝牙通信的博客都没有标明这个错误,应该是手机之间不会出现这个错误。但是,同样的代码用于蓝牙串口通信就会有乱码!!就会有乱码!!就会有乱码!!
这个乱码有时是出现在末尾,或者是一串字符传过来,就只显示了最后一个字符等等奇奇怪怪的神奇现象。这个现象在我仔细研究了他的BluetoothChatService中的run()方法并结合网上的博客之后发现了问题。
这个问题是由InputStream这个类导致的。它的读取方法是,每次循环都将InputStream中的所有字符读出来。但是在蓝牙串口通信时,它有可能导致一句话没有传完,就已经被读取出来。所以会出现衔接和乱码等问题。
以下是解决办法:通过available方法来得知InputStream中的字符串个数,由于我的需求每次传一个字符就可以,所以我这里buffer是char[1],在接收完成后,把available减去相应的字符串个数即可。

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修改方法。已经通过串口调试工具验证,发送接受都无问题。
本人第一次更新博客,如有不足敬请指出。
BluetoothChat用于蓝牙串口通信的修改方法的更多相关文章
- Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+
建议使用4.+版本,避免一些不必要的bug.4.+版本文档地址:https://www.cnblogs.com/shanya/articles/16062256.html SerialPortUtil ...
- Android Studio 的蓝牙串口通信(附Demo源码下载)
根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...
- 玩转X-CTR100 l STM32 l STM32F4 l 蓝牙串口通信
我造轮子,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 蓝牙串口通信模块,X-CTR100控制 ...
- Arduino学习笔记⑥ 硬件串口通信
1.前言 Ardunio与计算机通信最常用的方式就是串口通信.在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接.该转换芯片 ...
- C# 编程实现串口通信
http://blog.sina.com.cn/s/blog_6c67dab30101p3vn.html ----------------------------------------------- ...
- 在ubuntu下利用minicom实现串口通信
windos有串口调试助手,linux下也有这样的工具——minicom.不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受.作为一款串口调试工具,虽然难看但 ...
- stm32串口通信实验,一点笔记
第一次深入学习stm32,花了好长时间才看懂代码(主要是C语言学习不够深入),又花了段时间自己敲了一遍,然后比对教程,了解了利用中断来串口通信的设置方法. 板子是探索版f407,本实验工程把正点原子库 ...
- Qt串口通信专题教程
查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...
- 在C#中实现串口通信的方法
通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围.可以访问h ...
随机推荐
- Centos7安装PHP7
安装依赖 yum updateyum install gcc-c++ libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel lib ...
- [LeetCode] Integer Break 整数拆分
Given a positive integer n, break it into the sum of at least two positive integers and maximize the ...
- [LeetCode] Combination Sum II 组合之和之二
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- JS组件系列——又一款MVVM组件:Vue(一:30分钟搞定前端增删改查)
前言:关于Vue框架,好几个月之前就听说过,了解一项新技术之后,总是处于观望状态,一直在犹豫要不要系统学习下.正好最近有点空,就去官网了解了下,看上去还不错的一个组件,就抽空研究了下.最近园子里vue ...
- ACM模板(持续补完)
1.KMP #include<cstring> #include<algorithm> #include<cstdio> using namespace std; ...
- 【Quartz】将定时任务持久化到数据库
之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果,我们需要在 ...
- vue.js 第四课
(1).插值:在view层上显示model的资料. (2).绑定表达式:在view层上 执行js命令. (3).指令:在view层上 执行写好的功能. (4).缩写:v-bind 绑定 特性 v-on ...
- FastDFS 通过文件名获取文件信息
/** * 获取文件信息 * * param string group_name 文件所在的组名 * param string file_id 文件id(如: M00/09/BE/rBBZolgj6O ...
- openvpn 启动
安装 yum -y install openvpn 配置文件可以放在: /etc/openvpn 例如,我这里的路径: [mslagee@centos-dev ~]$ cd /etc/openvpn/ ...
- position导致Safari工具栏不自动隐藏
一般情况下,移动端网页在上滑的时候,Safari的工具栏会自动隐藏掉,下滑的时候又会出现. 但是,如果可滑动区域的最外层box写了position:absolute,就不会自动隐藏了. 例如像这样的页 ...