赞
踩
大家应该都知道手机和电脑上都有蓝牙功能吧,蓝牙的功能强大,比如两个手机可以连上蓝牙来进行数据的交换,这里的数据与可以是图片、视频或者音乐等。本次先来介绍蓝牙模块。
蓝牙模块的具体实物图见下图所示。可以看出该模块共引出6个引脚。VCC、GND、RXD、TXD、STATE、EN。
资料链接:https://pan.baidu.com/s/1V3ZK5eqk0trze7PLqD3wgA 提取码:7185
蓝牙串口模块/JDY-31(6针) 资料下载(浏览器粘贴直接下载):https://www.yourcee.com/filedownload/533344
蓝牙串口模块/JDY-31(4针) 资料下载(浏览器粘贴直接下载):https://www.yourcee.com/filedownload/533845
咱们下载好资料后,内容如下图所示。
首先咱们先介绍一下这个模块,原来咱们买的是生厂商焊接后的样子了,你看下图,如果直接给我们下图所示的模块,是非常不利于我们进行项目的开发的。
下图是模块的具体参数,重点关注通讯接口(UART)和工作电压(3.3V)。可以看出传输距离还是蛮大的,30米的距离已经很远了。
此外,这个模块属于从机。
下图可以看到其实能用的引脚并不多的,主要用到的是TXD、RXD、VCC、GND、EN、STAT这几个引脚。
下图是常用的蓝牙模块常用的指令集。
我们用USB转TTL模块来对蓝牙模块进行设置。
只需要连接两个模块的4个引脚即可。VCC(蓝牙模块)-5V(串口模块)、GND(蓝牙模块)–GND(串口模块)、TXD(蓝牙模块)-RXD(串口模块)、RXD(蓝牙模块)-TXD(串口模块)
接到电源上后,可以看到蓝牙模块上唯一的小灯处于闪烁状态,从这个现象可以推断出,小灯的另一端是接到ALED
上的。
当我欢喜的打开串口助手后发现,并没有识别到串口。原来是驱动没有安装导致。经过一顿操作之后,终于可以识别了。
参考博客:CP2102 USB to UART Bridge Controller 驱动安装(windows or Ubuntu)
此时用串口助手软件可以识别到串口了。
查看版本号:AT+VERSION
软复位:AT+RESET
查看模块的波特率:AT+BAUD
,下图显示的是4,也即是波特率为9600。
同样,我们也可以设置模块的波特率:AT+BAUD<Param>
,这里举个例子,如果想要设置模块的波特率为115200,可以发送:AT+BAUD8
最后在查看下目前的波特率:AT+BAUD
。因为目前模块的波特率发生改变,我们需要实现修改下串口助手的相关配置。
有个小细节,这里给大家提及一下,你看咱们发送完AT+BAUD
,串口助手记得设置为16进制显示。尾部的0x0d
和0x0a
,根据ascii码表,可以得到0x0d代表的是回车,0x0a代表的是换行。
蓝牙配对密码查看:AT+PIN
修改蓝牙配对密码:AT+PIN8888
再次使用AT+PIN
,查看设置是否成功。
广播名查询:AT+NAME
广播名修改:AT+NAMEJDY-31
再次使用AT+NAME
,查看设置是否成功。
恢复出厂配置:AT+DEFAULT
,这个咱们就不运行了哈。
串口状态输出使能查询:AT+ENLOG
,默认输出1,说明打开串口状态输出。
串口状态输出使能设置:AT+ENLOG<Param>
,这里几个例子,比如打开串口状态输出使能,AT+ENLOG1
。关闭串口状态输出使能,AT+ENLOG0
。
断开连接:AT+DISC
,这里返回的是+OK
,目前模块还未连接,本身就处于断开状态。
查看蓝牙MAC地址:AT+LADDR
main.c
文件。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "oled.h"
#include "bmp.h"
int main(void)
{
RCC->APB2ENR |= (uint32_t)0x00000010;//打开GPIOC时钟
GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零
GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13为推挽输出,最大速度50MHz
//-------------------------------------------------------------------------//
Delay_Init();//延时初始化
//-------------------------------------------------------------------------//
Usart_Init(115200);//串口初始化
//-------------------------------------------------------------------------//
OLED_Init_new(); //初始化OLED
OLED_Clear_new();
OLED_ShowString_new(1, 1, "bluetooth:");
//-------------------------------------------------------------------------//
printf("AT+NAME\r\n"); //查询蓝牙名字
Delay_ms(100);
printf("AT+LADDR\r\n"); //查询mac地址
Delay_ms(100);
printf("AT+BAUD\r\n"); //查询波特率
Delay_ms(100);
printf("AT+PIN\r\n"); //查询蓝牙连接密码
Delay_ms(100);
printf("AT+ENLOG\r\n"); //查询状态输出使能状态
Delay_ms(100);
printf("AT+VERSION\r\n"); //查询版本
Delay_ms(100);
while(1)
{
GPIOC->BSRR = (uint32_t)0x00002000;//PC13引脚输出高电平
Delay_ms(1800); //延时1800ms
GPIOC->BRR = (uint16_t)0x2000; //PC13引脚输出低电平
Delay_ms(1800); //延时1800ms
}
}
usart.c
文件。
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"
int fputc(int ch,FILE *f)
{
USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送完成
return ch;
}
/**
* @func fputcc
* @brief 发送一个字节数据到USARTx
为Motion_Driver库提供串口打印接口
* @param
@arg ch : 一字节数据
* @retval 返回指定字节数据
**/
int fputcc(int ch)
{
/* 发送一个字节数据到USARTx */
USART_SendData(USART1, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
void Usart_Init(uint32_t bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//打开USART1和GPIOA的时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA10引脚
USART_InitStructure.USART_BaudRate = bound; //串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位为1位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;//发送接收模式
USART_Init(USART1,&USART_InitStructure); //初始化USART1
//参考博客:https://blog.csdn.net/m0_63235356/article/details/135611700
//---------------------------------------------------------------//
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //开启USART接收中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//NVIC中断配置
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStruct);
//---------------------------------------------------------------//
USART_Cmd(USART1,ENABLE); //使能USART1
}
/**
* @func USART_SendChar
* @brief 控制串口发送一个字符
* @param
@arg chr : 要发送的字符
* @retval 无
**/
void USART_SendChar(uint8_t chr)
{
/* 循环发送,直到发送完毕 */
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
USART_SendData(USART1,chr);
}
usart.h
文件。
#ifndef __USART_H
#define __USART_H
#include "stm32f10x.h"
#include <stdio.h>
void Usart_Init(uint32_t bound);
int fputc(int ch,FILE *f);
int fputcc(int ch);
void USART_SendChar(uint8_t chr);
#endif
stm32f10x_it..h
文件。
#include "stm32f10x.h"
#include "delay.h"
#include "stdio.h"
//中断函数
void USART1_IRQHandler(void)
{
//判断数据接收标志位
if(SET==USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){
uint16_t data=USART_ReceiveData(USART1); //读取出接收的数据
printf("%c",data);
USART_ClearITPendingBit(USART1,USART_FLAG_RXNE); //清除数据接收标志位
}
}
最终的效果如下图所示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。