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 ...
随机推荐
- xib和storyBoard哪些事之UIimage和按钮注意事项
1.uiimageView 和按钮比较特殊,可以只设置其x,y就可以. 2.可以设置其丝例,如1:1,或者当前图片的比例,这样保证不会变形,设置比例在自身上点击control拉个线,选择 3.在右侧就 ...
- 虚拟机上装uoj
前期准备: x64 ubuntu 镜像.vmware.ss账号 注意一定要有64位镜像! ss不是必须的,不过没有的话就等着下载一晚上吧... 首先先装好ubuntu,我装的是ubuntu-16.04 ...
- dubbox 的各种管理和监管
dubbo官方自带了dubbo-admin及dubbo-simple/dubbo-monitor-simple二个子项目用于服务治理及服务监控. 一.dubbo-admin的部署 这个比较简单,编译打 ...
- [LeetCode] Serialize and Deserialize BST 二叉搜索树的序列化和去序列化
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- 日历插件FullCalendar应用:(二)数据增删改
接上一篇 日历插件FullCalendar应用:(一)数据展现. 这一篇主要讲使用fullcalendar插件如何做数据的增删改,用到了art.dialog web对话框组件,上一篇用到的webFor ...
- 我的博客CSS
这个是按照custom标准模板来做的,博客园已经有模版了,有些细节不是很好,这个是源CSS,喜欢的可以自由DIY,完善更好. @charset "utf-8"; /* CSS Do ...
- ubuntu下载工具uget和aria2
一直想在ubuntu下找到个和迅雷差不多的下载工具.在网上找到了. 这篇文章完全是抄袭整理网上的. 我的系统版本是ubuntu14.04. 1.安装uget和aria2 sudo apt-get in ...
- 关闭SELinux和iptables防火墙
1.关闭SELinux: 编辑SELinux配置文件: [root@Redis selinux]# vim /etc/selinux/config 修改SELINUX配置项为disable SELIN ...
- [bigdata] flume file channel CPU消耗比 memory channel高的原因
https://www.quora.com/Why-does-flume-take-more-resource-CPU-when-file-channel-is-used-compared-to-wh ...
- SHELL编写NGINX服务控制脚本
使用源码包安装的Nginx没办法使用"service nginx start"或"/etc/init.d/nginx start"进行操作和控制,所以写了以下的 ...