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命令格式说明

节能模式

相关推荐
zxfeng~3 天前
AG32 FPGA部分简单开发
fpga开发·嵌入式·ag32
电子老师傅3 天前
如何挑选海外4G模组?这里有秘籍!
物联网·嵌入式·硬件工程·4g模组
CodeAllen嵌入式4 天前
嵌入式面试题练习 - 2024/11/15
数据结构·windows·嵌入式硬件·算法·嵌入式·嵌入式系统
知行电子-5 天前
Proteus中数码管动态扫描显示不全(已解决)
单片机·proteus·嵌入式
Tfly__8 天前
Ubuntu 20.04 安装 QGC v4.3 开发环境
linux·c++·qt·ubuntu·github·嵌入式·无人机
憧憬一下8 天前
Linux 内核中断描述符 (irq_desc) 的初始化与动态分配机制详解
arm开发·嵌入式硬件·嵌入式·c/c++·linux驱动开发
源码超级联盟10 天前
51单片机和stm32单片机区别
单片机·嵌入式
jjyangyou12 天前
物联网核心安全系列——物联网安全需求
物联网·算法·安全·嵌入式·产品经理·硬件·产品设计
憧憬一下12 天前
Pinctrl子系统中Pincontroller和client驱动程序的编写
arm开发·嵌入式·c/c++·linux驱动开发