基于STM32的双蓝牙通信

您所在的位置:网站首页 双系统能互相传资料吗 基于STM32的双蓝牙通信

基于STM32的双蓝牙通信

2024-07-14 11:42| 来源: 网络整理| 查看: 265

首先我们应该让两个蓝牙间互相通信

1.准备两个蓝牙模块(主从一体),用USB转TTL连接到电脑,再打开两个串口分别连接两个蓝牙模块,上电同时按住蓝牙上的按键进入AT指令模式(指示灯慢闪),波特率设置为38400,发送AT 返回ok

2.在串口1中

发送AT+ORGL,恢复1的默认设置 返回ok

发送AT+ROLE=1,设置为主模式 返回ok

发送AT+PSWD="1234"(随便设置),设置密码

发送AT+UART=115200,0,0,设置波特率

3.在串口2中

发送AT+ORGL,恢复1的默认设置 返回ok

发送AT+ROLE=0,设置为从模式 返回ok

发送AT+PSWD="1234" 两个密码要一样

发送AT+UART=115200,0,0,两个波特率要一样

发送AT+ADDR?查询从蓝牙地址

4.在串口1中

发送AT+BIND="查询到的从蓝牙地址",记得把冒号换成逗号

5.退出AT模式,重新上电,等待指示灯2秒闪1次,依次闪烁两下,即配对成功

然后就可以通过串口进行发送和接收数据了。

使用STM32ZET6进行两个蓝牙的发送与接收数据

串口1用的太多了,每次占用还得改很麻烦,我直接用串口2(发送),和串口3(接收),也可以两个板子进行通信,道理一样,

蓝牙1连串口2(PA2,3),蓝牙2连串口3(PB10,11),

蓝牙           板子

RX    ------   TX

TX    ------    RX

蓝牙用5v,否则可能供电不足

/************usart2.c************/ #include "sys.h" #include "usart2.h" #include "usart.h" #include "lcd.h" static void NVIC_Config(void){ NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel=DEBUG_USART_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStructure.NVIC_IRQChannelSubPriority=1; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); } /***************************** 函数名:USART_Config 参数:无 波特率修改在usart.h文件中 作用:初始化串口2 *****************************/ void USART_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK,ENABLE); DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK,ENABLE); GPIO_InitStructure.GPIO_Pin=DEBUG_USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=DEBUG_USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure); USART_InitStructure.USART_BaudRate=DEBUG_USART_BAUDRATE; USART_InitStructure.USART_WordLength=USART_WordLength_8b; 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(DEBUG_USARTx,&USART_InitStructure); NVIC_Config(); USART_ITConfig(DEBUG_USARTx,USART_IT_RXNE,ENABLE); USART_Cmd(DEBUG_USARTx,ENABLE); } /***************************** 函数名:USART2_SENDDATA 参数:数组地址,长度 作用:发送数组 调用示例:USART2_SENDDATA(s,10),s定义为 u8 s[] *****************************/ void USART2_SENDDATA(u8 *USART2_SendDATA,u16 SIZE) { u16 i = 0; for(i = 0;i < SIZE;i++) { USART_SendData(USART2,USART2_SendDATA[i]); LCD_ShowNum(30,70+i*15,USART2_SendDATA[i],2,16); while( USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);//发送完了标志位 } } /************usart2.h************/ #ifndef __USART2_H #define __USART2_H #include "stm32f10x.h" #include #define DEBUG_USARTx USART2 //蓝牙所用串口2 #define DEBUG_USART_CLK RCC_APB1Periph_USART2 //串口时钟 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd //串口时钟使能 #define DEBUG_USART_BAUDRATE 115200 //波特率设置· #define DEBUG_USART_GPIO_CLK RCC_APB2Periph_GPIOA #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd //端口时钟 #define DEBUG_USART_TX_GPIO_PORT GPIOA //端口宏定义 #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_2 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_3 #define DEBUG_USART_IRQ USART2_IRQn #define DEBUG_USART_IRQHandler USART2_IRQHandler //中断服务函数 static void NVIC_Config(void); void USART_Config(void); void USART2_SENDDATA(u8 *USART2_SendDATA,u16 SIZE); //int fputc(int ch, FILE *f); #endif /************usart3.c************/ #include "sys.h" #include "usart3.h" #include "usart.h" #include "lcd.h" u8 USART3_RX_BUF[USART3_REC_LEN]; //数组用来存储接收到的数据,而USART3_REC_LEN为最多能接收的字节限度 //u16 USART3_RX_STA=0; //接收状态标记 0-14位为接收字节数,15位接收完成标志位 uint8_t len=0;//接收字符长度 uint8_t Flag=0;//接收状态标志 /***************************** 函数名:usart3_init 参数:u32 bound 为波特率 调用示例:usart3_init(115200) 作用:初始化串口3 *****************************/ void usart3_init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructurea; USART_InitTypeDef USART_InitStruct; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能串口3 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能GPIOB USART_DeInit(USART3);//串口3复位 不是必要的一步 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStructure); //PB10设置为复用推挽输出 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11; GPIO_Init(GPIOB,&GPIO_InitStructure); //PB11设置为浮空输入 NVIC_InitStructurea.NVIC_IRQChannel=USART3_IRQn; NVIC_InitStructurea.NVIC_IRQChannelCmd=ENABLE; NVIC_InitStructurea.NVIC_IRQChannelPreemptionPriority=1; NVIC_InitStructurea.NVIC_IRQChannelSubPriority=1; NVIC_Init(&NVIC_InitStructurea); //串口3中断的设置 USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//串口3中断使能和中断类型设置 USART_InitStruct.USART_BaudRate=bound;//串口波特率 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;//字长为8位数据格式 USART_Init(USART3,&USART_InitStruct); //串口3的一些参数设置 USART_Cmd(USART3,ENABLE);//串口3使能 } 接收中断,接收·单个数据 //void USART3_IRQHandler(void){ //串口3中断服务程序(固定的函数名不能修改) // u16 a; // //if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){ //接收中断(接收到的数据必须是0x0d 0x0a结尾) // a =USART_ReceiveData(USART3);//读取接收到的数据 // // //printf("%d",a); //把收到的数据发送回电脑 // LCD_ShowNum(30,70,a,2,16); //} //} /***************************** 函数名:USART3_IRQHandler 参数:无 作用:中断服务函数,接收数组 修改建议:修改if语句中的len== ;用来匹配自己定义的数组 *****************************/ __IO uint8_t usart_value=0; void USART3_IRQHandler(void) { int j =0; if(USART_GetITStatus(USART3,USART_IT_RXNE)){ usart_value=USART_ReceiveData(USART3); USART3_RX_BUF[len]=usart_value; len++; } if(len==10){ Flag=1;//接收完毕 //display(); len=0; } USART_ClearFlag(USART3,USART_IT_RXNE); } //测试程序 void display() { int i=0; for(i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3