BluetoothChat用于蓝牙串口通信的修改方法

时间:2022-12-13 12:24:00

  本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车。界面只用了一个小时就写好了,重要的问题是如何与板子所带的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用于蓝牙串口通信的修改方法
 1     ​menuButton.setOnClickListener(new OnClickListener() {
2
3 @Overridepublic
4
5 void onClick(View v) {
6
7 openOptionsMenu();
8
9 }
10
11 });
BluetoothChat用于蓝牙串口通信的修改方法

  

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

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

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

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

BluetoothChat用于蓝牙串口通信的修改方法
 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修改方法。已经通过串口调试工具验证,发送接受都无问题。​

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

BluetoothChat用于蓝牙串口通信的修改方法的更多相关文章

  1. 玩转X-CTR100 l STM32 l STM32F4 l 蓝牙串口通信

    我造*,你造车,创客一起造起来!更多塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      蓝牙串口通信模块,X-CTR100控制 ...

  2. Arduino学习笔记⑥ 硬件串口通信

    1.前言     Ardunio与计算机通信最常用的方式就是串口通信.在Arduino控制器上,串口都是位于Rx和Tx两个引脚,Arduino的USB口通过一个转换芯片与这两个串口引脚连接.该转换芯片 ...

  3. C# 编程实现串口通信

    http://blog.sina.com.cn/s/blog_6c67dab30101p3vn.html ----------------------------------------------- ...

  4. 在ubuntu下利用minicom实现串口通信

    windos有串口调试助手,linux下也有这样的工具——minicom.不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受.作为一款串口调试工具,虽然难看但 ...

  5. stm32串口通信实验,一点笔记

    第一次深入学习stm32,花了好长时间才看懂代码(主要是C语言学习不够深入),又花了段时间自己敲了一遍,然后比对教程,了解了利用中断来串口通信的设置方法. 板子是探索版f407,本实验工程把正点原子库 ...

  6. Qt串口通信专题教程

    查看以前的教程:Qt编写串口通信程序全程图文讲解 查看Wincom和Lincom介绍:Qt跨平台串口通信软件Wincom与Lincom 下载软件,文档和源码:资源下载 ——————————————20 ...

  7. 在C#中实现串口通信的方法

    通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册,不在本文讨论范围.可以访问h ...

  8. Qt 串口通信 高速发送出错的解决方法总结

    使用网上的qextserialport-1.2类,自行开发多线程串口通信.开发的过程中,出现两个问题:   问题1:我用信号槽跨线程调用串口类MyCom 发送和接收数据,中间运行的时候,会内存错误,Q ...

  9. c#中实现串口通信的几种方法

    c#中实现串口通信的几种方法 通常,在C#中实现串口通信,我们有四种方法: 第一:通过MSCOMM控件这是最简单的,最方便的方法.可功能上很难做到控制自如,同时这个控件并不是系统本身所带,所以还得注册 ...

随机推荐

  1. 高频交易算法研发心得--MACD指标算法及应用

    凤鸾宝帐景非常,尽是泥金巧样妆. 曲曲远山飞翠色:翩翩舞袖映霞裳. 梨花带雨争娇艳:芍药笼烟骋媚妆. 但得妖娆能举动,取回长乐侍君王. [摘自<封神演义>纣王在女娲宫上香时题的诗] 一首定 ...

  2. I2C总线协议的简要说明

    为了快速的了解I2C总线协议,此处采用另类的方式进行说明. 倘若你和另外一个人只能通过一个开关加灯泡的装置在不同的两个房间进行交流,以下是很简单能说明的一个模型: 你的房间有一个开关,另外一间房间有一 ...

  3. Alcatraz的安装和使用

    一.简单说明 Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCode的 插件.模版以及颜色配置的工具. 二.如何安装 1.github地址:https://github.com/a ...

  4. Java中执行外部命令

    在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...

  5. R&period;Net 用法

    using (REngine engine = REngine.CreateInstance("RDotNet")) { engine.Initialize(); var expa ...

  6. Codeforces348C - Subset Sums

    Portal Description 给出长度为\(n(n\leq10^5)\)的序列\(\{a_n\}\)以及\(m(m\leq10^5)\)个下标集合\(\{S_m\}(\sum|S_i|\leq ...

  7. mysql清空表

    清空某个mysql表中所有内容 delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate tabl ...

  8. angular开发环境配置全套教程

    第一步.安装node.js 1.需要下载的文件路径:https://nodejs.org/en/download/ 2.安装nodejs: 3.验证node.js 4.npm安装以及验证: npm的安 ...

  9. 接口自动化:HttpClient &plus; TestNG &plus; Java&lpar;二&rpar; - 第一个接口测试:get请求

    在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...

  10. 使用Dockerfile来构建镜像

    Dockerfile原理 创建Dockerfile Dockerfile实例 Dockerfile指令 注释 FROM MAINTAINER RUN ADD WORKDIR ENV USER COPY ...