首先我们应该让两个蓝牙间互相通信
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 <stdio.h>
#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<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(115200); //串口初始化为115200
usart3_init(115200);
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://www.toymoban.com/news/detail-416441.html
作者能力有限,才疏学浅,在学习过程中碰到很多问题,写下既是帮自己记忆,也是希望能帮到别人,希望大家批评指正。文章来源地址https://www.toymoban.com/news/detail-416441.html
到了这里,关于基于STM32的双蓝牙通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!