基于STM32的双蓝牙通信

这篇具有很好参考价值的文章主要介绍了基于STM32的双蓝牙通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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的库

基于STM32的双蓝牙通信

 作者能力有限,才疏学浅,在学习过程中碰到很多问题,写下既是帮自己记忆,也是希望能帮到别人,希望大家批评指正。文章来源地址https://www.toymoban.com/news/detail-416441.html

到了这里,关于基于STM32的双蓝牙通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32蓝牙模块通过手机和电脑双向通信

    只需将蓝牙连到单片机上,使用usart3(PB10、PB11)作为蓝牙和单片机的数据传输,而电脑的收发数据要是用usart1(PA9、PA10),将数据存入数组中,从而在串口助手中打印值  1. 下面是usart.c文件,将io口和串口初始化,并且加入中断(其中电脑发送时,所用的中断需要回车换行,

    2023年04月09日
    浏览(45)
  • stm32与手机进行蓝牙通信(超详细版)

            本人也是小白,看了很多博客都没做出来,如果你也是小白,希望这篇文章可以帮助你。      这篇文章是为了实现蓝牙控制stm32灯翻转,并且stm32每次返回给手机的数字加3,需要其他的功能可直接根据模板改。 软件下载链接:串口调试助手:UartAssist串口调试助

    2024年02月09日
    浏览(36)
  • STM32--- 蓝牙HC-08 (两模块间主从通信)

    1.1  开发软硬环境 芯片型号:STM32F103RCT6 开发软件:Keil5  (v5.31+AC5,最常用) 代码用库:标准固件库 蓝牙模块:HC-08 (汇承家的;  缺点:小贵 ,优点:pdf+串口助手+APP+小程序,完美) USB转TTL模块: CH9340C  (Type-C接口,win10可免驱动,比CH340和CP2102爽) 1.2  代码下载链接

    2024年02月03日
    浏览(69)
  • STM32F1 + 蓝牙HC08 与 手机APP通信

    1.1  开发软硬环境 芯片型号:STM32F103RCT6 开发软件:Keil5  (v5.31+AC5,最常用) 代码用库:标准固件库 蓝牙模块:HC-08 (HC家的,小贵 ,配套图解、串口助手、APP、小程序,完美) USB转TTL模块: CH9340C  (Type-C接口,win10可免驱动,比CH340和CP2102爽) 1.2  代码下载链接 百度网

    2024年02月04日
    浏览(55)
  • HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程

    ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩因为之前无论是电赛还是做项目,都用到了蓝牙模块,如:手机和stm32的通信,电赛中的双车通信,还是遥感小车的stm32与stm32的无线通信等等 ⏩本篇文章对HC-05蓝牙模块与手机的通信做一个详

    2024年02月03日
    浏览(76)
  • STM32与无线通信技术的应用:蓝牙、Wi-Fi和LoRa

    STM32是一款广泛应用于嵌入式系统的微控制器单元(MCU),它可以与多种无线通信技术进行集成,包括蓝牙、Wi-Fi和LoRa。本文将分别介绍STM32与这三种无线通信技术的应用。 1. STM32与蓝牙应用 蓝牙技术是一种短距离无线通信技术,用于在设备之间传输数据。STM32可以与蓝牙模块集

    2024年04月27日
    浏览(45)
  • 基于STM32的最简易蓝牙遥控小车

    本篇博客主要针对的读者为有一定单片机基础,但是第一次自制蓝牙遥控小车的小白同学,所用物件型号选择的是作者最熟悉、最常用的,老手请自行发挥。 硬件包括小车的机械部分、STM32f103c8t6最小系统板、ST-LINK下载器,HC-05蓝牙模块、CH340模块、L298N电机驱动模块,焊接设

    2024年02月04日
    浏览(47)
  • 基于STM32的蓝牙遥控避障小车

    文章目录 前言 一、 组成部分及功能介绍 二、 代码实例 1. main函数 2. 定时器初始化 3.串口部分 4.超声波部分 5.舵机 三、实物效果 总结     这是笔者第一次尝试在CSDN这个平台上编写文章,主要是想借此来记录一下自己做过的一些小项目,算是为生活添加乐趣叭~(^^)  本文

    2023年04月16日
    浏览(42)
  • [毕设]基于STM32的语音识别智能蓝牙音箱设计

    (源程序+原理图+PCB+设计说明书+PPT) 原理图:Altium Designer 程序编译器:keil4/keil 5 编程语言:C语言 设计编号:Y002 本设计制作了以蓝牙接收模块,语音识别和STM32单片机为核心的蓝牙音箱。实现的具体要求如下: 1.语音识别: 采用基于自动语音识别技术的LD3320语音识别方案

    2023年04月21日
    浏览(42)
  • Qt实现安卓手机蓝牙通信并控制stm32f103c8t6驱动VFD屏

    Qt具有跨平台的特性所以非常适合写通信的demo,但是在这个例程中Qt蓝牙部分不支持Windows平台,安卓平台使用没问题。 Qt蓝牙主要涉及到三个类的使用: QBluetoothDeviceDiscoveryAgent //扫描周围蓝牙设备 QBluetoothLocalDevice //扫描本地蓝牙 QBluetoothSocket //建立蓝牙的socket读写 安卓不支

    2024年02月08日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包