STM32第十六天蓝牙模块

一:蓝牙模块HC-05
1:硬件引脚配置:
| 标号 | PIN   | 说明                                  |
|------|-------|---------------------------------------|
| 1    | START | 状态引出引脚(未连接/连接输出信号时) |
| 2    | RXE   | 接收端                                |
| 3    | TXE   | 发送端                                |
| 4    | GND   | 模块供电负载                          |
| 5    | VCC   | 模块供电正极                          |
| 6    | EN    | 继电器(需进入命令模式时拨3.3V)      |

(上表中VCC接5v,EN接3.3v,START不接) 

2:AT设置工作横式 ·

1.自动连接横式,又称为透传模式。

2.AT横式 (AT mode)进入AT横式的两种方法:

1.按住引脚或EN引脚拉高 (接入3.3V),此时灯是慢闪,进入AT模式,波特率默认是38400;这个模式我们叫做原始模式,原始模式下一直处于AT命令模式状态。

2.HC-05上电开机,红灯快闪,按住按键戏EN引脚拉高 (接入3.3V) , HC.05进入AT命令模式,默认波特率是9600, 这种模式下是正常模式,正常模式下只有按住按键或拉高EN引1脚才处于AT命令状态。

|注意:如果波待率没有设置正确,AT命令是执行无效的。

HC-05 蓝牙模块工作模式详解

工作模式分类
  1. 自动连接模式(透传模式)

    • 模块默认工作状态

    • 自动搜索并连接配对设备

    • 建立双向数据传输通道(串口透传)

    • 指示灯状态:红灯快闪(约1秒2次)

  2. AT模式(配置模式)

    • 用于参数配置的专用模式

    • 通过AT指令修改名称、波特率、配对密码等

    • 不支持数据传输

    • 指示灯状态:慢闪(约2秒1次)

AT模式进入方法
方法1:原始AT模式(永久配置状态)
项目说明
进入条件上电前按住按键或将EN引脚接3.3V高电平
指示灯慢闪(持续状态)
波特率固定38400
特性模块始终处于AT命令状态,适合批量烧录配置
退出方式必须断电重启(不按按键)

 

方法2:临时AT模式(动态切换状态)
项目说明
进入条件正常启动后(红灯快闪时),按住按键或拉高EN引脚至3.3V
指示灯快闪→慢闪(状态切换)
波特率默认96000(可修改)
特性仅当按键/EN保持高电平时处于AT状态,松开即返回透传模式
退出方式松开按键/EN引脚拉低
关键注意事项
  1. 波特率匹配

    • 原始模式:必须使用38400

    • 临时模式:默认96000(除非已修改)

    • 不匹配将导致AT指令无响应

  2. 电气特性

    • EN引脚需稳定接入3.3V(不可浮空)

    • 电压超过3.3V可能损坏模块

  3. 指令格式要求

    • 所有AT指令必须以换行符结束(\r\n

    • 参数需严格遵循格式(如AT+NAME="HC05"

  4. 配置保存机制

    • 原始模式:配置即时生效(也需要重启加AT+RESET

    • 临时模式:需发送AT+RESET保存配置

 

3.基本配置(所有AT命令都必须换行)
正常模式下是9600, AT模式波特率固定为 38400,8位数据位,1位停止位,无奇偶校验的通信方式
·发送 AT\r\n, 回复 OK
·发送 AT+UART?\r\n,, 回复 +UART9600, 0, 0

·发送 AT+UART=115200, 0, 0\r\n, 回复OK。

通过上述步骤波特率即配置成功。
·发送 AT+NAME="XXXX",修改蓝牙模块名称为XXXX
·发送 AT+ROLE=0, 蓝牙模式即为从模式
。发送AT+CMODE=1, 蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接
。发送 AT+PSWD=1234, 蓝牙配对密码为 1234
·发送 AT+UART=9600, 0, 0, 蓝牙通信串口波特率为 9600,停止位1位,无校验位
配置完成,需要重启一次 AT+RESET

4: 蓝牙项目步骤
·1.蓝牙模块AT模式基础配置
。 1.蓝牙连接 ch340模块接线 TX,RX、VCC、GND、EN五根引脚
。 2.AT指令配置波特率、蓝牙名称、从模式、配对密码
•2.蓝牙硬件连接32单片机TX,RX、VCC、GND、四根引脚
·3.初始化蓝牙连接申口的时钟,引脚和外设配置
·4.串口接收中断服务函数实现数据的接收和发送

usart.c

#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"void my_usart2_Init()//千万不要和32库里面串口定于的名字一样,不然会报错
{GPIO_InitTypeDef my_usart_Initstruct;USART_InitTypeDef USART_Initstruct;NVIC_InitTypeDef NVIC_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE );NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_2 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP ;my_usart_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &my_usart_Initstruct);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_3;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOA, &my_usart_Initstruct);USART_Initstruct.USART_BaudRate=9600;USART_Initstruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None  ;USART_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;USART_Initstruct.USART_Parity= USART_Parity_No;USART_Initstruct.USART_StopBits=USART_StopBits_1  ;USART_Initstruct.USART_WordLength=USART_WordLength_8b;USART_Init(USART2,&USART_Initstruct );USART_Cmd(USART2, ENABLE);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);NVIC_Initstruct.NVIC_IRQChannel= USART2_IRQn  ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}void my_usart_Init()//千万不要和32库里面串口定于的名字一样,不然会报错
{GPIO_InitTypeDef my_usart_Initstruct;USART_InitTypeDef USART_Initstruct;NVIC_InitTypeDef NVIC_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_9 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP ;my_usart_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &my_usart_Initstruct);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_10 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOA, &my_usart_Initstruct);USART_Initstruct.USART_BaudRate=115200;USART_Initstruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None  ;USART_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;USART_Initstruct.USART_Parity= USART_Parity_No;USART_Initstruct.USART_StopBits=USART_StopBits_1  ;USART_Initstruct.USART_WordLength=USART_WordLength_8b;USART_Init(USART1,&USART_Initstruct );USART_Cmd(USART1, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_Initstruct.NVIC_IRQChannel= USART1_IRQn  ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData( USARTx, Data);while(USART_GetFlagStatus( USARTx, USART_FLAG_TXE) != SET);}void My_Usart_Send_Sting(USART_TypeDef* USARTx,char * str)
{uint16_t i=0;do{My_Usart_Send_Byte(USARTx,*(str+i));i++;}while(*(str+i) != '\0');while(USART_GetFlagStatus( USARTx, USART_FLAG_TC) != SET);}int fputc(int ch, FILE * p)
{USART_SendData( USART1, (u8)ch);while(USART_GetFlagStatus( USART1, USART_FLAG_TXE) != SET);return ch;}void  USART1_IRQHandler()
{char str;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){str=USART_ReceiveData(USART1);printf("shuju=%c\r\n",str);if(str=='0'){GPIO_ResetBits( GPIOA, GPIO_Pin_1);printf("LED IS ON\r\n");}if(str=='1'){GPIO_SetBits( GPIOA, GPIO_Pin_1);printf("LED IS OFF\r\n");}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}void  USART2_IRQHandler()
{char str;if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){str=USART_ReceiveData(USART2);printf("shuju=%c\r\n",str);if(str=='0'){GPIO_ResetBits( GPIOA, GPIO_Pin_1);printf("LED IS ON\r\n");}if(str=='1'){GPIO_SetBits( GPIOA, GPIO_Pin_1);printf("LED IS OFF\r\n");}USART_ClearITPendingBit(USART2,USART_IT_RXNE);}}

 usart.h

#ifndef USART_H_
#define USART_H_void my_usart_Init(void);void my_usart2_Init(void);
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str);#endif

main.c

#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"void delay(uint16_t time)//延时1ms  软件延时粗延时
{uint16_t i=0;while(time --){i=12000;while(i --);}}int  main()
{my_usart_Init();my_usart2_Init();LED_Init();//	My_Usart_Send_Byte( USART1, 'A');
//	My_Usart_Send_Byte( USART1, 'B');
//	My_Usart_Send_Byte( USART1, 'C');//	My_Usart_Send_Sting( USART1, "kobe \r\n");printf("kobe is king \r\n");while(1){
//		USART_SendData( USART1,  'A');}}

今日心得

1:用户提到AT模式使用的是38400波特率,但查询UART设置时返回的却是9600?

核心原因:
  1. 双波特率机制

    • AT模式波特率:固定38400(进入配置模式时使用)

    • 工作模式波特率:可配置(透传模式使用的波特率)

  2. AT+UART? 命令的本质

    • 查询的不是当前AT模式波特率

    • 查询的是透传模式(工作模式)的波特率设置

 

  • ✅ AT+UART? 只显示工作模式波特率,不显示AT模式波特率

  • ✅ AT模式波特率固定为38400且不可更改

  • ✅ 您看到的9600是模块在透传模式下的通信波特率

  • ✅ 您的所有AT命令执行成功(每个都返回OK)

使用建议:
  1. 配置时

    • 始终使用38400与AT模式通信

    • AT命令只修改透传模式参数

  2. 透传使用时

    • 使用配置的波特率(您最后设为9600)

    • 需与配对设备保持相同波特率

提示:当模块无响应时,优先检查:

  1. AT模式必须用38400

  2. 透传模式用配置的波特率(如9600)

  3. EN引脚保持稳定连接

 2:AT+ROLE=0为蓝牙模式的从模式,解释一下什么是从模式和代码

什么是从模式(Slave Mode)?

当设置 AT+ROLE=0 时,HC-05 模块被配置为从模式,这是蓝牙通信中的被动角色:

特性说明
角色定位被动等待连接(类似"服务员")
连接行为无法主动扫描/连接其他设备,只能被主设备(Master)发现并连接
典型应用作为外围设备(如传感器、执行器)与手机/电脑配对
工作状态启动后广播自身存在(可被手机蓝牙列表检测到)
连接限制同一时间只能被一个主设备连接(1:1连接)

✅ 对比主模式(AT+ROLE=1:主设备可主动扫描连接多个从设备(类似"顾客") 

3:设置密码为4位数 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913362.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时序数据库IoTDB用户自定义函数(UDF)使用指南

1. 编写UDF时序数据库IoTDB为用户提供了编写UDF的JAVA API,用户可以自主实现UDTF(用户自定义转换函数)类,IoTDB将通过类加载机制装载用户编写的类。Maven依赖如果使用Maven,可以从Maven库中搜索以下依赖,并…

Linux国产与国外进度对垒

Linux国产与国外进度对垒 引言国产Linux的发展现状国外Linux的发展现状技术对比国产Linux的挑战与机遇国外Linux的优势与局限结论 引言 简述Linux在全球操作系统市场中的地位国产Linux的发展背景与意义国外主流Linux发行版的现状 国产Linux的发展现状 主要国产Linux发行版介…

Jenkins-Email Extension 插件插件

Editable Email Notification Editable Email Notification 是 Jenkins 的 Email Extension 插件的核心功能,用于自定义邮件通知,包括邮件主题、内容、收件人、发件人等 属性 1.Project From 项目发件人,设置邮件的发件人地址 **注意&…

windows系统下将Docker Desktop安装到除了C盘的其它盘中

windows系统下安装docker会自动安装到C盘,可以采用下面的方法将其安装到其它盘中1、先下载Docker Desktop安装程序Docker Desktop Installer.exe,比如你下载到了C:\Users\YourUsername\Downloads 文件夹中。 2、打开 PowerShell 进入C:\Users\YourUser…

视频工具箱 1.1.1 |小而美的视频处理工具,支持多种常用功能

VideoTools是一款基于FFmpeg的小而美的视频处理工具,专为需要快速高效地进行视频编辑的用户设计。这款工具无需安装,体积仅约200KB,提供了视频压缩、格式转换、转GIF、修改分辨率、加速播放以及音频提取等多种常用功能。其用户界面简洁直观&a…

无人机集群搜索技术全面解析

无人机集群搜索是指通过多架无人机协同工作,实现对目标区域的高效覆盖与快速探测。这项技术通过模拟自然界生物群体的集体行为,利用分布式控制和自主决策算法,使无人机集群能够自组织地完成复杂搜索任务。下面从核心技术、应用场景、算法实现…

【Elasticsearch】深度分页及其替代方案

深度分页及其替代方案 1.深度分页2.为什么不推荐深度分页2.1 性能问题(核心原因)2.2 资源消耗对比2.3 实际限制 3.深度分页的替代方案3.1 方案一:Search After(推荐)3.1.1 为什么 Search After 性能更高3.1.2 技术原理…

论文阅读笔记——VGGT: Visual Geometry Grounded Transformer

VGGT 论文 输入是 N 个 RGB 图像 I i ∈ R 3 H W I_i\in\mathbb{R}^{3HW} Ii​∈R3HW 的序列 ( I i ) i 1 N (I_i)^N_{i1} (Ii​)i1N​,观察相同 3D 场景。 VGGT 的 Transformer 是一个映射函数,将此序列映射为一组对应的 3D 标注, f ( …

【嵌入式电机控制#11】PID控制入门:对比例算法应用的深度理解

接下来内容需要数学功底,并且有现成结论的内容不做推导,重在讲解工程实践中的方法论,建议控制类专业或学习过相关理论的人阅读 一、开闭环系统 (1)开环控制系统:被控对象输出对控制器的输出没有影响 &…

多视图几何:本质矩阵与基础矩阵

文章目录 1. 前置知识1.1. 向量叉乘1.2. 混合积1.3. 引理证明 2. 本质矩阵3. 基础矩阵4. 应用例子 1. 前置知识 1.1. 向量叉乘 假设 a ( a x a y a z ) \mathbf{a} \begin{pmatrix} a_x \\ a_y \\ a_z \end{pmatrix} a ​ax​ay​az​​ ​ 以及 b ( b x b y b z ) \mat…

Hive集群之间迁移的Linux Shell脚本

新旧 Hive 集群之前数据迁移单表脚本 migrate_hive_single_table.sh #!/bin/bash#配置参数 OLD_NAMENODE"hdfs://<old-namenode>:<old-port>" EXPORT_PATH"/tmp/hive-export/dm" NEW_DB"dm_events" TABLE_NAME"dm_usereventfi…

新时代的开始,华为开源仓颉编程语言!

7月30日&#xff0c;华为即将开源自研的仓颉编程语言。 仓颉这个名字很有意思。传说中的仓颉创造了汉字&#xff0c;开启了中华文明的文字时代。华为用这个名字&#xff0c;体现了对中华文化的致敬。从2020年开始研发&#xff0c;到去年首次亮相&#xff0c;再到现在的全面开源…

【python实用小脚本-128】基于 Python 的 Hacker News 爬虫工具:自动化抓取新闻数据

引言 在技术社区中&#xff0c;Hacker News 是一个汇聚最新技术文章和讨论的热门平台。许多开发者和技术爱好者依赖它来获取行业动态和前沿资讯。然而&#xff0c;手动浏览和筛选这些文章可能耗时且低效。本文将介绍一个基于 Python 的 Hacker News 爬虫工具&#xff0c;它能够…

mac 电脑安装Homebrew来安装npm与node成功后,安装nvm的流程

文章目录 前言一、卸载node(如果没下载可以忽略这步)1.官网下载安装包的2. homebrew安装的 二、安装Homebrew(1) 命令安装&#xff08;2&#xff09;出现上面提示&#xff0c;执行对应的命令&#xff08;3&#xff09;校验是否安装成功 三&#xff1a;安装node&#xff08;Home…

根据无人机倾斜摄影osgb做的3dmax模型3dtiles制作,导出.b3dm加载到谷歌地图cesiumlab

根据无人机倾斜摄影osgb做的3dmax模型3dtiles制作&#xff0c;导出.b3dm加载到谷歌地图cesiumlab 根据无人机倾斜摄影osgb做的3dmax模型3dtiles制作&#xff0c;导出.b3dm加载到谷歌地图cesiumlab

Yocto项目:嵌入式Linux开发的“万能烹饪手册”

目录 一.Yocto是什么? 二.Yocto如何运作&#xff1f; 2.1 三大核心工具 2.2 实例 三.为什么开发者爱用Yocto&#xff1f; 3.1 ​自由定制&#xff0c;拒绝“全家桶”​​ 3.2 跨平台支持&#xff1a;从x86到火星芯片​ 3.3 工业级可靠性​ PetaLinux是Xilinx官方推出的…

【nosql】有哪些非关系型数据库?

非关系型数据库Nosql 分类 键值存储 (Key-Value Store): 代表: Redis, DynamoDB, RocksDB, etcd核心优势: 极致简单、超高读写性能&#xff08;尤其内存型&#xff09;、高吞吐。场景: 缓存、会话存储、配置、计数器、分布式协调、简单消息队列。 列式 / 宽列存储 (Wide-Colu…

Redis存储Cookie实现爬虫保持登录 requests | selenium

前言 前面已经介绍了requests和selenium这两种方式的基础知识和模拟登录,但是我们需要每次都进行登录,这明显是很麻烦并且不合理的,所以这次我分享一下怎么可以让我们的程序进行一次登录之后,和普通浏览器一样下次不进行登录直接进行对网站数据的爬取 下面的我分享的内容需要…

leetcode:474. 一和零[01背包][动态规划]

学习要点 给定背包容量&#xff0c;装满背包最多有多少个物品深入理解01背包深入理解动态规划 题目链接 474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法:01背包 class Solution { public:int findMaxForm(vector<string>& strs, int m, int …

UE5 使用过程遇到的问题

切换缓存位置 进入界面&#xff0c;选择-编辑-编辑器偏好设置搜索缓存&#xff0c;找到通用全局&#xff0c;修改本地DCC路径到要切换的位置 闪退报错 Fatal: Failed to get dll export function: cuvidGetDecoderCaps [NVDEC] 因为NVIDIA驱动没有卸载干净&#xff0c;使用D…