蓝牙模块使用的是XY_MBD07,XY-MBD07A 模块有两种工作模式: AT 指令工作模式,串口数据透传模式。模组未建立连接时模块处于 AT指令工作模式,当模块建立连接后模块处于串口数据透传模式。当模块建立连接后, CMD_DATA_SWITCH 引脚接低电平,模块会进入 AT 指令工作模式。
配置过程
这里使用的是串口4
void uart4_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4);
//UART4端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//UART4 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(UART4, &USART_InitStructure); //初始化串口4
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启相关中断
//Uart4 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(UART4, ENABLE);
}
uint8_t Fcount;
uint8_t Scount;
uint8_t tempData[20][50];
volatile uint8_t okFlag;
volatile uint8_t completeFlag;
uint8_t buff[20];
volatile uint8_t conectFlag;
uint8_t i,len,j;
void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(UART4, USART_IT_RXNE);
tempData[Fcount][Scount++] = USART_ReceiveData(UART4);
//判断结束标志
if( (tempData[Fcount][Scount-2]=='r') && (tempData[Fcount][Scount-1]=='n') )
{
Scount = 0;
if(strcmp(tempData[Fcount],"OKrn")==0) //返回OK
{
okFlag=1;
Fcount=0;
memset(tempData[Fcount],0,sizeof(tempData[Fcount]));
}else if(strcmp(tempData[Fcount],"SCAN Completedrn")==0) //扫描完成返回 SCAN Completed
{
completeFlag =1;
for(i=0;i
{
len = strlen(tempData
);
if(tempData[len-7]=='F'&&tempData[len-6]=='S') //扫描到名字带有FS的 蓝牙名字设置的是FS101/2/3...
{
conectFlag=1;
for(j=0;j<12;j++)
{
buff[j]=tempData[j]; //把扫描到的12位蓝牙地址存到buff
}
memset(tempData,0,sizeof(tempData));
break;
}
memset(buff,0,sizeof(buff));
}
count1 = 0;
memset(tempData,0,sizeof(tempData));
}
else
{
Fcount += 1;
}
}
}
}
void UART4_SendData(uint8_t *sen_buf,uint8_t sen_len)
{
while(sen_len--)
{
USART_SendData(UART4, *(sen_buf++));
while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET); // Wait for Empty
}
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
extern uint8_t okFlag; //返回OK标志
extern uint8_t completeFlag; //扫描完成标志
extern uint8_t conectFlag; //获取地址成功标志
extern uint8_t Fcount;
extern uint8_t buff[20];
uint8_t connectbuff[50];
//设置波特率
uint8_t buletooth_set(uint8_t *data1,uint8_t *data2)
{
UART4_SendData(data1,strlen((char *)data1)); //设置波特率
delay_ms(100);
if(okFlag)
{
okFlag=0;
UART4_SendData(data2,strlen((char *)data2));//开启串口流
delay_ms(100);
if(okFlag)
{
okFlag=0;
return 1;
}
}
return 0;
}
//蓝牙连接
uint8_t buletooth_connect(uint8_t *data)
{
UART4_SendData(data,strlen((char *)data));//扫描
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//printf("扫描中...rn");
if(completeFlag)
{
completeFlag=0;
delay_ms(1000);
if(conectFlag)
{
conectFlag=0;
Fcount=0;
sprintf(connectbuff,"AT+SCAN=%srn",buff);
while(okFlag==0)UART4_SendData(connectbuff,strlen((char *)connectbuff));//发送连接指令
memset(buff,0,sizeof(buff));
okFlag=0;
return 1;
}
}
memset(buff,0,sizeof(buff));
return 0;
}
int main()
{
uint8_t uartbuff[50]="AT+URATE=115200rn";
uint8_t strbuff[20]= "AT+FC=1rn";
uint8_t i=0;
uint8_t scanbuff[20]="AT+SCAN?rn";
delay_init(168); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
//uart1_init(115200); //串口初始化
uart4_init(115200);
MAX262_Init();
while(buletooth_set(uartbuff,strbuff)== 0) delay_ms(500); //蓝牙设置
//printf("设置成功rn");
while(buletooth_connect(scanbuff)==0)delay_ms(1000); //蓝牙配对
//printf("配对成功rn");
while(1);
}
以上就是XY-MBD07A 蓝牙模块配对过程配置,配对完成之后连个蓝牙就可以进行通信了
蓝牙模块使用的是XY_MBD07,XY-MBD07A 模块有两种工作模式: AT 指令工作模式,串口数据透传模式。模组未建立连接时模块处于 AT指令工作模式,当模块建立连接后模块处于串口数据透传模式。当模块建立连接后, CMD_DATA_SWITCH 引脚接低电平,模块会进入 AT 指令工作模式。
配置过程
这里使用的是串口4
void uart4_init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource10,GPIO_AF_UART4);
GPIO_PinAFConfig(GPIOC,GPIO_PinSource11,GPIO_AF_UART4);
//UART4端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//UART4 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(UART4, &USART_InitStructure); //初始化串口4
USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);//开启相关中断
//Uart4 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(UART4, ENABLE);
}
uint8_t Fcount;
uint8_t Scount;
uint8_t tempData[20][50];
volatile uint8_t okFlag;
volatile uint8_t completeFlag;
uint8_t buff[20];
volatile uint8_t conectFlag;
uint8_t i,len,j;
void UART4_IRQHandler(void)
{
if(USART_GetITStatus(UART4, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(UART4, USART_IT_RXNE);
tempData[Fcount][Scount++] = USART_ReceiveData(UART4);
//判断结束标志
if( (tempData[Fcount][Scount-2]=='r') && (tempData[Fcount][Scount-1]=='n') )
{
Scount = 0;
if(strcmp(tempData[Fcount],"OKrn")==0) //返回OK
{
okFlag=1;
Fcount=0;
memset(tempData[Fcount],0,sizeof(tempData[Fcount]));
}else if(strcmp(tempData[Fcount],"SCAN Completedrn")==0) //扫描完成返回 SCAN Completed
{
completeFlag =1;
for(i=0;i
{
len = strlen(tempData
);
if(tempData[len-7]=='F'&&tempData[len-6]=='S') //扫描到名字带有FS的 蓝牙名字设置的是FS101/2/3...
{
conectFlag=1;
for(j=0;j<12;j++)
{
buff[j]=tempData[j]; //把扫描到的12位蓝牙地址存到buff
}
memset(tempData,0,sizeof(tempData));
break;
}
memset(buff,0,sizeof(buff));
}
count1 = 0;
memset(tempData,0,sizeof(tempData));
}
else
{
Fcount += 1;
}
}
}
}
void UART4_SendData(uint8_t *sen_buf,uint8_t sen_len)
{
while(sen_len--)
{
USART_SendData(UART4, *(sen_buf++));
while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET); // Wait for Empty
}
}
#include "sys.h"
#include "delay.h"
#include "usart.h"
extern uint8_t okFlag; //返回OK标志
extern uint8_t completeFlag; //扫描完成标志
extern uint8_t conectFlag; //获取地址成功标志
extern uint8_t Fcount;
extern uint8_t buff[20];
uint8_t connectbuff[50];
//设置波特率
uint8_t buletooth_set(uint8_t *data1,uint8_t *data2)
{
UART4_SendData(data1,strlen((char *)data1)); //设置波特率
delay_ms(100);
if(okFlag)
{
okFlag=0;
UART4_SendData(data2,strlen((char *)data2));//开启串口流
delay_ms(100);
if(okFlag)
{
okFlag=0;
return 1;
}
}
return 0;
}
//蓝牙连接
uint8_t buletooth_connect(uint8_t *data)
{
UART4_SendData(data,strlen((char *)data));//扫描
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
//printf("扫描中...rn");
if(completeFlag)
{
completeFlag=0;
delay_ms(1000);
if(conectFlag)
{
conectFlag=0;
Fcount=0;
sprintf(connectbuff,"AT+SCAN=%srn",buff);
while(okFlag==0)UART4_SendData(connectbuff,strlen((char *)connectbuff));//发送连接指令
memset(buff,0,sizeof(buff));
okFlag=0;
return 1;
}
}
memset(buff,0,sizeof(buff));
return 0;
}
int main()
{
uint8_t uartbuff[50]="AT+URATE=115200rn";
uint8_t strbuff[20]= "AT+FC=1rn";
uint8_t i=0;
uint8_t scanbuff[20]="AT+SCAN?rn";
delay_init(168); //时钟初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置
//uart1_init(115200); //串口初始化
uart4_init(115200);
MAX262_Init();
while(buletooth_set(uartbuff,strbuff)== 0) delay_ms(500); //蓝牙设置
//printf("设置成功rn");
while(buletooth_connect(scanbuff)==0)delay_ms(1000); //蓝牙配对
//printf("配对成功rn");
while(1);
}
以上就是XY-MBD07A 蓝牙模块配对过程配置,配对完成之后连个蓝牙就可以进行通信了
举报