首先我们应该让两个蓝牙间互相通信
1.准备两个蓝牙模块(主从一体),用USB转TTL连接到电脑,再打开两个串口分别连接两个蓝牙模块,上电同时按住蓝牙上的按键进入AT指令模式(指示灯慢闪),波特率设置为38400,发送AT 返回ok
2.在串口1中
发送AT+ORGL,恢复1的默认设置 返回ok
发送AT+ROLE=1,设置为主模式 返回ok
发送AT+PSWD="1234"(随便设置),设置密码
发送AT+UART=,0,0,设置波特率
3.在串口2中
发送AT+ORGL,恢复1的默认设置 返回ok
发送AT+ROLE=0,设置为从模式 返回ok
发送AT+PSWD="1234" 两个密码要一样
发送AT+UART=,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 <stdio.h> #define DEBUG_USARTx USART2 //蓝牙所用串口2 #define DEBUG_USART_CLK RCC_APB1Periph_USART2 //串口时钟 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd //串口时钟使能 #define DEBUG_USART_BAUDRATE //波特率设置· #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() 作用:初始化串口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<10;i++) { LCD_ShowNum(100,70+i*15,USART3_RX_BUF[i],2,16); } } /usart3.c/ #ifndef __USART3_H #define __USART3_H #include "stm32f10x.h" #define USART3_REC_LEN 20 void usart3_init(u32 bound); void USART3_IRQHandler(); void display(); #endif /*main.c/ #include "sys.h" #include "delay.h" #include "usart2.h" #include "usart3.h" #include "lcd.h" #include "usart.h" / 双蓝牙串口收发数据 串口2 PA2/3 串口3 PB10/11 / int main(void) { u8 s[10]={1,2,3,4,5,6,7,8,9,10}; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 delay_init(); //延时函数初始化 uart_init(); //串口初始化为 usart3_init(); USART_Config(); LCD_Init(); POINT_COLOR=RED; LCD_ShowString(10,30,200,16,16,"Elite STM32"); //USART_SendData(USART2,'A');//发送单个数值 USART2_SENDDATA(s,10); LCD_ShowString(20,50,200,16,16,"Send"); LCD_ShowString(90,50,200,16,16,"Receive"); //while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位 while(1) { /*不使用中断服务函数*/ // s=USART_ReceiveData(USART3); // printf("t:%d\r\n",s); // LCD_ShowNum(30,70,s,2,16); // LCD_ShowString(30,90,200,16,16,"STM32F10X"); // delay_ms(500); } }
讯享网
参照注释,这里我用了LCD显示,你们用的时候需要添加LCD的库

作者能力有限,才疏学浅,在学习过程中碰到很多问题,写下既是帮自己记忆,也是希望能帮到别人,希望大家批评指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/71846.html