本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车。界面只用了一个小时就写好了,重要的问题是如何与板子所带的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用于蓝牙串口通信的修改方法的更多相关文章

  1. Android 蓝牙串口通信工具类 SerialPortUtil 3.0.+

    建议使用4.+版本,避免一些不必要的bug.4.+版本文档地址:https://www.cnblogs.com/shanya/articles/16062256.html SerialPortUtil ...

  2. Android Studio 的蓝牙串口通信(附Demo源码下载)

    根据相关代码制作了一个开源依赖包,将以下所有的代码进行打包,直接调用即可完成所有的操作.详细说明地址如下,如果觉得有用可以GIthub点个Star支持一下: 项目官网 Kotlin版本说明文档 Jav ...

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

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

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

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

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

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

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

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

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

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

  8. Qt串口通信专题教程

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

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

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

随机推荐

  1. [LeetCode] Count The Repetitions 计数重复个数

    Define S = [s,n] as the string S which consists of n connected strings s. For example, ["abc&qu ...

  2. [LeetCode] Walls and Gates 墙和门

    You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or an obstac ...

  3. [LeetCode] One Edit Distance 一个编辑距离

    Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance ...

  4. 微信支付(.NET版)

    前段时间做了网页版微信支付,遇到很多问题,不过最终还是解决了,现在在这里记录下开发流程以及说明,给其他人一些参考. 一.准备工作     首先肯定得先要开通微信支付功能,之前开通微信支付需要三万的押金 ...

  5. c#连接关闭了,事务并没有关闭

    用的是mysql引擎是InnoDB,用到了连接池. 连接还没关闭,但是事务开启,并执行了更新id=14的操作,这是把这一行锁住了,可以查询,但不能更新和删除,必需等锁释放,提交换回滚事务时锁被释放.直 ...

  6. sql查询慢优化

    SELECT g.goods_id, g.type_id, g.user_id, g.productname, g.img, g.intro, g.attr, u.companyname, u.enl ...

  7. caffe调试小结2

    1.裁剪  crop size227,在训练时候采用随机裁剪,在测试时候只裁剪中间部分

  8. linux 让程序在后台运行的几种可靠方法

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

  9. Java中创建对象的5种方式

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  10. ios 生成问题

    上午的时候遇到ios打包的时候出现问题,生成没有问题,但是安装到手机的时候出现问题,错误如下 The certificate used to sign "AppName" has ...