四轮两驱小车(五):蓝牙HC-08通信

news/2025/3/15 3:42:25/

前言:

        在我没接触蓝牙之前,我觉得蓝牙模块应用起来应该挺麻烦,后来发觉这个蓝牙模块的应用本质无非就是一个串口

蓝牙模块:

 

        这是我从某宝上买到的蓝牙模块HC-08,价格还算可以,而且可以适用于大多数蓝牙调试软件。回到刚开始说的话,蓝牙模块的应用和单片机的串口几乎是一样的,我们可以用USB转TTL模块与HC-08模块进行通信,虽说HC-08有6个引脚,但是我们只用4个,连接方式如下对应

USB转TTLHC-08
3V3VCC
TXDRXD
RXDTXD
GNDGND

连接之后,蓝牙模块蓝色灯闪烁(没和手机连接)。串口助手选择波特率为9600,我们可以直接用串口助手发送AT指令,当蓝牙模块回馈OK的时候,说明我们的蓝牙模块没有问题。

        接下来给大家罗列一下常用的AT指令

指令响应说明
ATOK检验串口是否正常工作
AT+RXName:HC-08 >>(蓝牙名称)
Role:Slave >>>>(模块角色 主 M / 从 S)
Baud:9600,NONE (串口波特率, 校验位)
Addr:48,70,1E,24,16,27>>(蓝牙地址)
PIN :000000>>>>[ 蓝牙密码 (密码无效) ]
查询模块的基本参数
AT+DEFAULTOK恢复出厂设置,不会清除主机已记录的从机地址!若要清除请在 未连线状态下使用 AT+CLEAR 指令进行清除。模块会自动重启,重启 200ms 后可进行新的操作
AT+RESETOK重启模块,模块会自动重启,重启 200ms 后 可进行新的操作
AT+VERSIONHC-08 V3.3,2020-10-16获取软件版本和发布日期
AT+ROLE=xMaster/Slave设置主机/从机;默认从机,设置后模块将自动重启, 重启 200ms 后可进行新的操作

  STM32驱动HC-08例程:

        下面是我的部分代码,包括了初始化部分,和中断部分,看完这部分代码,我们就更能理解为啥我说蓝牙模块的应用和串口几乎一致。因为我的蓝牙模块连接的刚好是USART2,所以代码部分如下

void USART2_Init(unsigned int Baudrate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//TXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//RXGPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);USART_InitStructure.USART_BaudRate = Baudrate;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //关闭硬件流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStructure.USART_Parity = USART_Parity_No;				 //无校验位USART_InitStructure.USART_StopBits = USART_StopBits_1;		 //1个停止位USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8个数据位USART_Init(USART2, &USART_InitStructure);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);	//允许接收中断USART_Cmd(USART2, ENABLE);NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//??1????NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//?????3NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//????3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ????NVIC_Init(&NVIC_InitStructure);	//??????????VIC????}

        中断服务函数编写

void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2,USART_IT_RXNE) == 1)							//USART_FLAG_RXNE判断数据,== 1则有数据{if(Receive_sum > 49)													//数组能存放50个字节的数据				{USART_ReceiveString[49] = '\0';										//数据字节超过50位时,将最后一位设置为\0	Receive_Flag = 1;													//接收标志位置1,停止接收数据Receive_sum = 0;													//数组下标置0}if(Receive_Flag == 0)													//接收标志位等于0,开始接收数据{USART_ReceiveString[Receive_sum] = USART_ReceiveData(USART2);		//通过USART2串口接收字符Receive_sum++;														//数组下标++if(USART_ReceiveString[Receive_sum-1] == '%'){Receive_Flag = 1;Receive_sum = 0;printf("%s\r\n",USART_ReceiveString);					if(strcmp(USART_ReceiveString,"channel:1%") == 0){FSM_led = LED_state1;FSM_hc08 = Channel_1;Receive_Flag = 0;}else if(strcmp(USART_ReceiveString,"channel:2%") == 0){FSM_led = LED_state2;FSM_hc08 = Channel_2;Receive_Flag = 0;}}}USART_ClearITPendingBit(USART2,USART_IT_RXNE);							//接收后先清空标志位}
}


http://www.ppmy.cn/news/30237.html

相关文章

webgpu思考obj携带属性

今天在搞dbbh.js的时候,想到一个问题,啥问题呢,先看看情况 画2个材质不相同的box的时候 首先开始createCommandEncoder,然后beginRenderPass,分歧就在这里了 第一个box,他有自己的pipeline,第二个也有,那么…

CSS 选择器以及CSS常用属性

目录 🐇今日良言:可以不光芒万丈,但不要停止发光 🐯一、写CSS的三种方法 🐯二、CSS选择器的常见用法 🐯三、CSS常用属性 🐇今日良言:可以不光芒万丈,但不要停止发光 🐯一、写CSS的三种方法 CSS的基本语…

Go项目(商品微服务-2)

文章目录简介handler商品分类轮播图品牌和品牌与分类oss前端直传库存服务数据不一致redis 分布式锁小结简介 开发商品微服务 API 层类似的,将 user-web 目拷贝一份,全局替换掉 user-web修改 config 去掉不用的配置更新本地和远程 nacos 配置文件 把 pro…

【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)

一、安装与汉化 对版本没要求的可以直接选择 3、免安装的汉化包 1、下载安装MarkText MaxText win64 https://github.com/marktext/marktext/releases/download/v0.17.1/marktext-setup.exe 使用迅雷可以快速下载 2. 配置中文语言包 中文包下载地址:GitHub - chi…

LaTeX表格自定义行高+自定义列宽+大表格自适应页面宽度

一、自定义行高 默认行高效果 自定义行高效果:看起来更美观、大方些 实现方式:在LaTeX表格中的\begin{table}和\begin{tabular}之间插入命令\renewcommand\arraystretch{1.5},其中1.5这个数值是可以自定义的,数值越大,…

Python进阶-----面对对象6.0(绑定方法[类方法、静态方法]与内置方法)

目录 前言: 1.绑定方法 (1)实例方法 (2)类方法 (3)静态方法 2.类型检测 (1)issubclass() 函数 (2)isinstance() 函数 3.内置方法&#xf…

springboot自动装配原理

引言 springboot的自动装配是其重要特性之一&#xff0c;在使用中我们只需在maven中引入需要的starter&#xff0c;然后相应的Bean便会自动注册到容器中。例如&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

我就不信你还不懂HashSet/HashMap的底层原理

&#x1f4a5;注&#x1f4a5; &#x1f497;阅读本博客需备的前置知识如下&#x1f497; &#x1f31f;数据结构常识&#x1f31f;&#x1f449;1️⃣八种数据结构快速扫盲&#x1f31f;Java集合常识&#x1f31f;&#x1f449;2️⃣Java单列集合扫盲 ⭐️本博客知识点收录于…