BT04-E蓝牙模块

BT04-E蓝牙模块

简介

本文章主要为笔者记录使用深圳大夏龙雀科技有限公司生产的蓝牙模块BT04-E的笔记,主要有两种测试方式,第一种为PC端测试蓝牙模块(AT模式),第二种为MCU通过蓝牙模块与移动端完成透传。

具体硬件基于深圳大夏龙雀科技有限公司生产的蓝牙模块。

名词解释

透传:透明传输(SerialNet)。即在传输过程中,对外界透明,不管所传输的内容、数据协议形式,不对要传输数据做任何处理,只是把需要传输的内容当成一组二进制数据完美地传输到目的节点。相当于一条数据线或者串口线,同时保证传输的质量即可,而不对传输的业务进行处理。

串口透传:这个词汇一般出现在串口模块中,串口模块接上MCU用透传方式把MCU要发的数据发送到接收端,串口模块不会对MCU要发送的数据做任何处理(串口也是最简单、最常见的MCU通讯方式)。

AT命令模式和透传模式

PC端测试蓝牙模块(AT模式)

需要一根USB转TypeC的数据线,TypeC转TTL模块,BT04-E模块

按照引脚提示完成链接

通过串口助手进行测试,使用时注意AT指令的用法(官方文档中有详细用法)

如下为使用AT模式下的回应

MCU通过蓝牙模块与移动端完成透传

MCU为STM32F103系列。

接线方式为

STM32F103C8T6 蓝牙(主)
3.3V 3.3V
GND GND
PA9 RX
PA10 TX

参考代码

c 复制代码
//USART.c
#include "USART.H"
 uint8_t buff[buf_max]={0};
 uint8_t buf_count=0;
void USART1_Config(u32 bound)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	
  
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure; 


    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);
 

    //USART1_TX   GPIOA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;         
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
    GPIO_Init(GPIOA,&GPIO_InitStructure);            

    //USART1_RX      GPIOA.10初始化
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;               
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    
    GPIO_Init(GPIOA,&GPIO_InitStructure);                    

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;       
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;       
    NVIC_Init(&NVIC_InitStructure);         

    //USART 初始化设置
    USART_InitStructure.USART_BaudRate = bound;                   
    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(USART1,&USART_InitStructure);        

    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);   
		USART_ITConfig(USART1,USART_IT_IDLE,ENABLE);   
		
    USART_Cmd(USART1,ENABLE);                     
}


void USART1_IRQHandler(void)  
{  
	// 接收中断的时候收集数据包
   
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); //只USART_ReceiveData也可以

       buff[buf_count++]= USART_ReceiveData(USART1);
    }
    // 空闲中断的时候说明串口没数据了,收集完成
    else if(USART_GetFlagStatus(USART1, USART_FLAG_IDLE) != RESET)
    {
        USART1->DR;	
        USART1_SEND(buff,buf_count);
        memset(buff,0,sizeof(buff));
        buf_count = 0;		
    }
} 

//重定向C库函数printf到串口,重定向后可使用printf函数
int fputc(int ch,FILE *f)
{
	/* 发送一个字节数据到串口 */
	USART_SendData(USART1,(uint8_t) ch);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	return (ch);
}

/* USART1字符串发送函数*/
void USART1_SEND(u8* data,u16 length)
{
	u16 i;
  for( i=0;i<length;i++)
	{
	USART_SendData(USART1,data[i]);
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
	}
}
c 复制代码
//main.c
#include "sys.h"
#include "delay.h"
#include "USART.h"
//**** 声明 ********************************************************************
/*******************************************************************************
 * 下面来自互联开源程序,由深圳市大夏龙雀科技有限公司收集
 * 方便用户参考学习,本公司不提供任何技术支持
 * 程序仅供测试参考,不能应用在实际工程中,不一定能通过编译
 * 公司网站 http://www.szdx-smart.com/
 * 淘宝网址 https://shop184598174.taobao.com/?spm=a1z10.5-c-s.w12096189-21564973333.3.547b1176WCCDxR&scene=taobao_shop
*******************************************************************************/

int main()
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置中断优先级
	USART1_Config(9600);
	USART1_SEND("AT+CONA98daa000d126\r\n",sizeof("AT+CONA98daa000d126\r\n"));      //AT+CONA 连接指定从机mac
    
    printf("hello world!\n");
	while(1)
	{

	};
	
}

关于代码,其中delay.h中只有us和ms函数,基本和主流实现方式没差别,直接替换即可。

主要设置部分官方全部集成在USART.c文件中了,main函数中只是做了一个初始化端口波特率为9600,其他是用于测试的代码。

当使用移动端完成蓝牙链接之后,进入透传模式,此时使用的USART1_SENDprintf函数中的内容都会直接显示在移动端中,效果如下:

参考资料

蓝牙模块1蓝牙模块_WiFi模块_LoRa模块_4G模块_GPS模块_深圳大夏龙雀科技有限公司-蓝牙模块_WiFi模块_LoRa模块_4G模块_GPS模块_深圳大夏龙雀科技有限公司

DX-BT04系列蓝牙模块-AT命令与手机透传教程_哔哩哔哩_bilibili

下面内容均从官方资料中截取,需要详细资料可以上官方网站下载

基本参数

模块引脚定义

串口基本参数

手机测试APP和PC端工具

MCU读写AT命令流程

使用移动端与模块进行通讯

AT命令格式说明

节能模式

相关推荐
别说我什么都不会13 小时前
使用Multipass编译OpenHarmony工程
操作系统·嵌入式·harmonyos
别说我什么都不会16 小时前
鸿蒙轻内核M核源码分析系列二一 05 文件系统FatFS
操作系统·嵌入式·harmonyos
cykaw25901 天前
NVIC原理和使用
stm32·单片机·嵌入式
别说我什么都不会2 天前
鸿蒙轻内核M核源码分析系列二一 03 文件系统LittleFS
操作系统·嵌入式·harmonyos
Jason_zhao_MR2 天前
米尔基于STM32MP25x核心板Debian系统发布,赋能工业设备
stm32·嵌入式硬件·物联网·debian·嵌入式
FreakStudio3 天前
万字长文手把手教你实现MicroPython/Python发布第三方库
python·嵌入式·开发工具·大学生·面向对象·技术栈·电子diy
楼台的春风3 天前
【Canny 边缘检测详细讲解】
图像处理·人工智能·opencv·算法·计算机视觉·matlab·嵌入式
cykaw25905 天前
如果STM32板子上晶振不是8MHz而是其他(如12MHz)怎么办?
stm32·单片机·嵌入式·电子
正点原子5 天前
在ZYNQ上跑超炫酷GUI!手把手教你移植LVGL到ZYNQ平台!
程序员·开源·嵌入式