HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信

简介: HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信

1、蓝牙模块的调试——解决无法与设置AT命令的问题


USB转TTL模块与HC-05蓝牙模块的接线:


两模块共地,两模块共VCC(VCC取5V);蓝牙模块的RX接转换模块的TX,蓝牙模块的TX接转换模块的RX。如下图所示:

image.png

这个时候就要将转换模块连接到电脑上,然后利用串口调试助手进行蓝牙模块的调试。


1)问题1:没有搜索到串口

首先我们需要尝试设置一下AT指令,但是连接串口的时候,你可能会遇到一下的问题:没有搜索到串口,但在确保正确连线的情况下,已经正确的上电,但是没有搜索的串口的原因,可能是没有安装驱动

image.png


方法1:网上下载驱动

在网上找了一个驱动,然后进行安装再次尝试

image.png

image.png

image.png


方法2:自己更新驱动

image.png

image.png

驱动安装完成后需要重启


  • 对比

安装驱动之前

image.png


2)问题2:串口打开失败–PL2303HXA自2012已停产,请联系供货商

成功安装了驱动之后又出现了一个问题,可以看到串口是可以被识别出来的,但打开失败,无法正常的使用

image.png

还是失败了,现在要解决停产的这个问题—“PL2303HXA自2012已停产,请联系供货商”


解决方法

参考链接

解决方法如下:

链接:https://pan.baidu.com/s/1jw1nsLGd23CagQ_dbkqu0w

提取码:vc0c

在这里下载驱动并解压

image.png

然后安装驱动

image.png

image.png

image.png

然后右键点击更新驱动程序

image.png

image.png

image.png

image.png

然后点击下一步

image.png

image.png

完成


串口测试

打开串口进行测试一下

image.png

可以正常的配对,接下来,继续进行蓝牙模块的调试

image.png


3)蓝牙模块的调试

HC-05蓝牙串口通讯模块具有两种工作模式:命令响应工作模式和自动连接工作模式。在自动连接工作模式下模块又可分为主(Master)、从(Slave)和回环(Loopback)三种工作角色。


  • 当模块处于自动连接工作模式时,将自动根据事先设定的方式连接的数据传输;
  • 当模块处于命令响应工作模式时能执行AT命令,用户可向模块发送各种AT 指令,为模块设定控制参数或发布控制命令。

怎么进入命令响应工作模式?


进入命令响应工作模式有两种方法:

  • 模块上电,未配对情况下就是AT模式,波特率为模块本身的波特率,默认:9600,发送一次AT指令时需要置高一次PIO11;
  • PIO11 置高电平后,再给模块上电,此时模块进入AT 模式,波特率固定为:38400,可以直接发送AT指令。

什么叫做置高一次PIO11?


在蓝牙模块中有一个小按键,按一下就置高一次PIO11。也就是说,第一种方法需要每发送一次AT指令按一次;而第二种方式是长按的过程中上电,之后就无需再管了,直接发送AT命令即可。


需要注意一下,两种进入命令响应工作模式的方式使用的波特率是不一样的,建议使用第二种方式。


怎么区分进了命令响应工作模式呢?

在蓝牙模块上有灯,当灯快闪的时候,就是自动连接工作模式;当灯慢闪的时候,就是命令响应工作模式,当灯慢闪两下的时候就是与手机正常连接模式。

image.png


4)AT命令

进入到命令响应工作模式之后,就可以使用串口调试助手进行蓝牙调试了。


首先有一点,AT指令不区分大小写,均以回车、换行结尾。下面介绍常用的AT指令:

image.png

对于AT指令,有几点注意:


  • AT+NAME?:获得设备名称,这个AT指令有很大可能性是没有返回的,因为我也看到了很多的例子……,但是其他的指令都是没有问题的,直接设置设备名称就行了;
  • AT+UART?:获得串口参数,串口的参数一共有三个,波特率、停止位、检验位。其取值如下:

image.png

其默认值为:9600,0,0。


设置蓝牙参数

image.png

查看设置结果,设置成功

image.png

具体的AT指令集科研查看数据手册,需要的可以私信或者评论一下


2、手机与蓝牙模块之间的传输——解决无法连接的问题


直接将蓝牙模块与转换模块连接,再讲其连接到电脑上,蓝牙模块直接进入自动连接工作模式。


此时手机打开蓝牙串口调试应用,用其来连接蓝牙模块。


正常的情况下,先在手机进行配对,然后在蓝牙串口调试应用直接输入字符串,电脑的串口上就可以成功的接受到了。


但是我在测试的时候,可以这次配对上,但是没法正常连接

image.png

image.png


1)设想1:手机的问题

蓝牙可以配对,但无法连接


尝试了一下用手机和电脑和其他手机连接,发现均不可以

而使用另外一台的华为手机则可以成功的实现与电脑进行配对。(小米手机配对失败,而华为手机配对成功)

image.png

可见是我小米手机的蓝牙配对问题。


随后我就用了华为的那台手机进行测试,竟然发现华为的手机也无法与蓝牙模块进行配对,得出了一个结论,那就是和手机无关,应该是蓝牙模块需要一些其他设置被搜寻到。


2)设想2:蓝牙模块的配置问题

查资料,发现,蓝牙模块需要被设置为从机才可以被查找,随后进行了一番尝试,首先去查AT指令集(正点原子有提供)

image.png

编写AT指令进行设置,ok表明设置成功。

image.png

查询,确实设置为从模式

image.png

但是结果还是失败了。

image.png

这就表明,我设置的蓝牙模式是没有错误的1,应该是其他的问题


3)设想3:接线的问题

对于这个问题,我觉得是不可能的,因为我可以正常的配置AT指令


4)设想4:串口调试助手的问题

不断的更换蓝牙调试助手,名字就叫 蓝牙串口,然后就可以成功连接上了

image.png

可以实现手机与串口段的信息发送

image.png

最后,成功解决,问题就出在串口调试助手上,得出的结论的就是,如果可以正常的配对,但无法正常连接的话,那就换你的手机或者是串口调试助手,因为蓝牙的兼容问题使得配对比较麻烦。


如果需要手机的串口调试助手的apk可以私信或者评论一下


3、手机蓝牙控制STM8单片机


之前的两个例子都是相比较而言比较简单的,这个例子将会涉及到程序的内容了。


实现功能:手机通过蓝牙,向STM8单片机发送消息,STM8接收到消息之后原封不动的返回给手机。当然如果掌握了这个例子,也可以修改成,手机发送特定的消息,然后,STM8单片机做出相对应的动作。比如:点亮LED等、发动电机等等。

image.png

原理就是:手机通过蓝牙传输到HC-05上,再通过串口通信和STM8通信;而之前一般都是电脑上通过USB线转串口的方式,通过串口和STM8通信。本质上没有区别的。

这个时候就应该更加深刻地体会到了本文开篇的一句话:说白了,只是个蓝牙转串口的设备,你只要知道串口怎么编程使用,就可以了,实现了所谓的透明传输。蓝牙的相关一切都被封装起来了,都不需要接触到。


知道了只是简单的串口通信,那么代码就很容易实现了


手机app的控制界面设计如下:

image.png


参考代码


/****************************************************************/
//接收单字符函数UART1_ReceiveByte(),无形参data,有返回值,返回接收到的数据
//采用查询的方法实现
/****************************************************************/
u8 UART1_ReceiveByte(void)
{
 // printf("进入UART1_ReceiveByte函数...\r\n");
  u8 UART1_RX_BUF;                //定义接收数据暂存变量
  while (!(UART1_SR & 0x20));    //等待接收标志
  UART1_SR&=0xDF;                //清零接收标志位RXNE
  UART1_RX_BUF=UART1_DR;         //取回接收到的数据
 // printf("取回接收到的数据\r\n");
  return  UART1_RX_BUF;         //返回暂存变量中的数据给调用者
}
/****************************************************************/
//初始化函数UART1_Init(),无形参和返回值
/****************************************************************/
void UART1_Init(void)
{
  //1.设定通信数据位数,此处设定为8位数据位,无校验位
  UART1_CR1 = 0x00;
  //**************************************************
  //展开UART1_CR1赋值二进制数值为:0000 0000 
  //含义:R8=0;    接收数据位不存在第9位
  //      T8=0;    发送数据位不存在第9位
  //      UARTD=0; 使能UART功能
  //      M=0;     一个起始位,8个数据位,n个停止位
  //                n取决于UART1_CR3中的STOP[1:0]位
  //      WAKE=0;   UART被空闲总线唤醒
  //      PCEN=0: (UART模式)奇偶校验控制被禁止
  //      PS=0;    偶校验(校验功能未启用)
  //      PIEN=0;  校验中断被禁止
  //*************************************************
  //2.设定通信停止位位数,此处设定为1位停止位
  UART1_CR3 = 0x00;
  //**************************************************
  //展开UART1_CR3赋值二进制数值为:0000 0000 
  //含义:保留位=0;必须保持清零
  //      LINEN=0;LIN模式被禁止
  //      STOP=00;配置为“00”,1个停止位
  //      CLKEN、CPOL、CPHA、LBCL这几位在UART3上不存在
  //*************************************************
  //3.配置通信波特率参数,此处配置为9600bps(16MHz频率下)
  UART1_BRR2 = 0x03;
  UART1_BRR1 = 0x68;
  //4.使能发送和接收功能
//  UART1_CR2 = 0x0C;
  UART1_CR2 = 0x2C;
  //**************************************************
  //展开UART1_CR2赋值二进制数值为:0010 1100 
  //含义:TIEN=0;发送中断被禁止
  //     TCIEN=0;发送中断完成被禁止
  //      RIEN=1;接收中断开启
  //      ILIEN=0;IDLE中断被禁止
  //      TEN=1;发送功能使能
  //      REN=1;接收功能使能
  //      RWU=0;(UART模式)正常工作模式
  //      PIEN=0;未发送断开字符
  //*************************************************
}
/****************************************************************/
//发送字符重定向函数putchar(),有形参ch,有返回值
/****************************************************************/
int putchar(int ch) 
{  
  UART3_SendByte((u8)ch);
 // UART1_SendByte((u8)ch);//将Printf内容发往串口
  return (ch); 
}
//接收中断服务函数
//**************************中断函数区域**************************
#pragma vector =  UART1_R_RXNE_vector         //0x14
__interrupt void UART1_RX_IRQHandler(void)
{ 
  if(UART1_SR&0x20){     //若UART1确实接收到了数据
     UART1_SR&=0xDF;       //清零接收标志位RXNE
  }
  cmd=UART1_DR;         //取回串口数据
 //  printf("进入中断服务函数...\r\n");
//   cmd = UART1_ReceiveString(1);
      switch(cmd)           //判断串口接收命令值
      {
        case 'a':
            Motor_TurnLeft();                   //左转
            break;
        case 'd':
            Motor_TurnRight();                  //右转
            break;
        case 'w':
            Motor_GoForward();                  //直走
            break;
        case 's':                               
            Motor_GetBack();                    //后退
            break;
        case 'p':                       
            Motor_BeParking();                  //停车
            break;
        case 'n':    //功能二:实现跟随模式              
            //printf("模式二:实现跟随模式   \r\n");
            LED1 = 1;  //熄灯
            Motor_BeParking();
            InfraredFollow_Module();
            break;
        case 'b':    //功能三:实现避障模式
            //printf("模式三:实现避障模式   \r\n");
            LED1 = 1;  //熄灯
            Motor_BeParking();
            InfraredAvoidance_Module();
            break
        default:
            printf("【ERROR】,没有此功能\r\n");
            break;
      }
}


关于中断向量号的查询可以查看这里:IAR中断向量表与中断服务函数的编写


可能会出现的问题


在通过手机设置一些按键,在电脑的串口调试助手上可能会看到中断函数会调用两次,重复的执行

image.png

但是我又换了一个串口调试助手就又没有问题了…真是头疼

image.png


参考链接:【常用模块】HC-05蓝牙串口通信模块使用详解(实例:手机蓝牙控制STM32单片机)


目录
相关文章
|
5月前
|
芯片
毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
|
移动开发 数据安全/隐私保护
HC05蓝牙模块与手机APP连接
HC05蓝牙模块与手机APP连接
575 0
|
11月前
小米手机 fastboot模式 显示 press any key to shutdown 解决方法(亲测有效,已解决)
小米手机 fastboot模式 显示 press any key to shutdown 解决方法(亲测有效,已解决)
706 0
|
2月前
|
网络协议 程序员 5G
IM开发者的零基础通信技术入门(十三):为什么手机信号差?一文即懂!
本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获。如果您大学学习过《计算机网络》这门课,那么一定不要错过本系列文章。
38 0
|
5月前
|
安全
要从手机传输一个大文件到笔记本电脑,蓝牙和 wifi 谁快?
要从手机传输一个大文件到笔记本电脑,蓝牙和 wifi 谁快?
|
5月前
|
移动开发 数据安全/隐私保护
HC05蓝牙模块与手机APP连接
HC05蓝牙模块与手机APP连接
174 1
|
网络协议 物联网 数据安全/隐私保护
CC2530+ESP8266与手机APP通信
通过CC2530控制ESP8266将其配置成AP+TCP服务器模式,并通过手机APP连接到TCP服务器并完成数据传输。ESP8266将作为一个热点(AP)来工作,其WiFi模块被配置为建立一个TCP服务器并监听端口号。CC2530将使用其串口与ESP8266进行通信,并通过AT指令控制ESP8266的WiFi模块设置和数据传输。
589 0
|
物联网 Android开发
聊聊身边的嵌入式,形态各异的手机蓝牙遥控器
聊聊身边的嵌入式,形态各异的手机蓝牙遥控器
|
物联网 Android开发 iOS开发
【DX-BT24蓝牙模块-AT命令与手机透传教程】
【DX-BT24蓝牙模块-AT命令与手机透传教程】
521 0
|
4月前
|
网络协议 Android开发 数据安全/隐私保护
Android手机上使用Socks5全局代理-教程+软件
Android手机上使用Socks5全局代理-教程+软件
3060 2

热门文章

最新文章

下一篇
无影云桌面