zoukankan      html  css  js  c++  java
  • HC-05蓝牙模块,主从一体机原理总结

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

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

    蓝牙模块的调试

    准备工作

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

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

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

    附可能会用到的驱动:链接:https://pan.baidu.com/s/1bpYLfCr 密码:yabv

    蓝牙模块的调试

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

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

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

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

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

    什么叫做置高一次PIO11?

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

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

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

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

    AT命令

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

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

    手机与蓝牙模块之间的传输(快速测试)

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

    手机蓝牙控制STM32单片机

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

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

    连接说明

    使用USART1进行试验,也就是说STM32选取PA9、PA10来和HC-05进行连接。同时手机通过蓝牙来和HC-05进行连接。

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

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

    STM32控制程序

      1 #include "stm32f10x.h"
      2  
      3  
      4 void My_USART1_Init(void)
      5  
      6 {
      7  
      8 GPIO_InitTypeDef GPIO_InitStrue;
      9  
     10 USART_InitTypeDef USART_InitStrue;
     11  
     12 NVIC_InitTypeDef NVIC_InitStrue;
     13  
     14  
     15 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能
     16  
     17 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口端口使能
     18  
     19  
     20 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
     21  
     22 GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
     23  
     24 GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
     25  
     26 GPIO_Init(GPIOA,&GPIO_InitStrue);
     27  
     28  
     29 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
     30  
     31 GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
     32  
     33 GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
     34  
     35 GPIO_Init(GPIOA,&GPIO_InitStrue);
     36  
     37  
     38 USART_InitStrue.USART_BaudRate=115200;
     39  
     40 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
     41  
     42 USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
     43  
     44 USART_InitStrue.USART_Parity=USART_Parity_No;
     45  
     46 USART_InitStrue.USART_StopBits=USART_StopBits_1;
     47  
     48 USART_InitStrue.USART_WordLength=USART_WordLength_8b;
     49  
     50  
     51 USART_Init(USART1,&USART_InitStrue);
     52  
     53  
     54 USART_Cmd(USART1,ENABLE);//使能串口1
     55  
     56  
     57 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
     58  
     59  
     60 NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;
     61  
     62 NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;
     63  
     64 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
     65  
     66 NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;
     67  
     68 NVIC_Init(&NVIC_InitStrue);
     69  
     70  
     71 }
     72  
     73  
     74 void USART1_IRQHandler(void)
     75  
     76 {
     77  
     78 u8 res;
     79  
     80 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
     81  
     82 {
     83  
     84 res= USART_ReceiveData(USART1);
     85  
     86 USART_SendData(USART1,res);
     87  
     88 }
     89  
     90 }
     91  
     92  
     93 int main(void)
     94  
     95 {
     96  
     97 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
     98  
     99 My_USART1_Init();
    100  
    101 while(1);
    102  
    103  
    104 }
    STM32控制程序

    这段程序和【STM32】串口相关配置寄存器、库函数(UART一般步骤)中的程序一模一样,几乎没有什么改动。

    区别就是,在UART实验中,USART1是和USB转串口模块连接在一起的,然后与电脑上的串口调试助手进行通信;现在改成USART1是和蓝牙模块连接在一起的,然后和手机上的蓝牙串口调试助手进行通信。

  • 相关阅读:
    【Python入门 】—— 关于Numpy的使用
    CSP 201512 | 201604考试题目
    【Python入门】 —— 用pycharm写7道简单的PTA题目吧!
    【Python入门】 —— 用pycharm写两道超简单的PTA题目~
    Crypto.AES 报错 | TypeError: Object type <class 'str'> cannot be passed to C code
    windows安装Pytorch报错:from torch._C import * ImportError: DLL load failed: 找不到指定的模块”解决方案
    Python中的self通俗理解(自己理解的,自我感觉比官网解释要容易懂)
    python获取token数据
    python根据对象的实例获取对象的属性值
    oracle查询某个字段不为空的sql语句
  • 原文地址:https://www.cnblogs.com/zhouyuqing1024/p/11859107.html
Copyright © 2011-2022 走看看