【新星计划】STM32F103C8T6 - C语言 - 蓝牙JDY-31-SPP串口通信实验

news2024/11/15 21:44:12

文章目录

      • 蓝牙技术的发展历史
        • SPP蓝牙串口
        • BLE协议(超低功耗应用蓝牙协议)
      • 常见通用蓝牙模块
        • JDY-31-SPP
        • HC05/06
      • Keil 工程开发模版
        • main.c 源文件:
        • 接线方式:
        • 烧录工具:FlyMcu
        • 串口调试工具:XCOM
        • 蓝牙调试助手APP
      • 实验效果:

蓝牙技术的发展历史

蓝牙技术的发展历史可以追溯到20世纪90年代初,当时瑞典通信公司Ericsson(爱立信)推动了一个名为“蓝牙”(Bluetooth)的项目。该项目的目标是通过无线连接来取代使用电缆传输数据和语音的设备。因此,蓝牙技术在企业中也往往与音频技术息息相关,如今最常见的产品就是无线蓝牙耳机与手机通讯:


图为上海山景的BP10开发板与手机进行蓝牙音频通信指标测试场景

蓝牙技术发展流历史:

在1996年,Ericsson成立了一个推动该技术的蓝牙SIG(特别兴趣组)。
1998年:蓝牙技术的第一个版本1.0发布,并且开始吸引其他公司的注意。这个版本的蓝牙规范定义了基本的无线连接协议,能够在短距离范围内(通常为10米)连接设备,并提供较低的功耗和可靠的数据传输。
1999年:推出了蓝牙技术的1.1版本,修复了一些早期版本中的问题,提高了互操作性和音频质量。
2000年:蓝牙技术的2.0版本发布。这个版本引入了增强数据传输速率的“增强数据速率”(Enhanced Data
Rate,EDR)功能,使得蓝牙连接更快速。同时,2.0版本还提供了蓝牙自适应频率跳频(AFH)功能,以减少干扰。
2003年:蓝牙技术的2.1版本发布,引入了更快的配对过程和安全增强功能。
2009年:蓝牙技术的3.0版本发布,引入了高速率的无线传输技术。这个版本可以通过Wi-Fi进行更高速的数据传输,并称为蓝牙高速(Bluetooth
High Speed)。 2010年:蓝牙技术的4.0版本发布,引入了低功耗功能,被称为蓝牙低功耗(Bluetooth Low
Energy,BLE),以满足物联网设备的需求,如传感器和健康监测设备。
2016年:蓝牙技术的5.0版本发布,提供更长的通信范围、更高的传输速率和更低的功耗。这个版本对物联网和无线音频设备提供了更好的支持。
从此以后,蓝牙技术继续发展,不断推出新的版本和改进,以满足不断增长的无线连接需求,并为各种设备提供更好的互联性和互操作性。

SPP蓝牙串口

通常我们所说的蓝牙实际就是基于SPP协议(Serial Port Profile)的蓝牙串口通信。

SPP蓝牙串口能在蓝牙设备之间创建串口进行数据传输的一种设备。蓝牙串口的目的是针对如何在两个不同设备(通信的两端)上的应用之间保证一条完整的通信路径。

具体的SPP协议技术栈包含很多通信相关的内容,大致流程如下:

建立连接:在SPP通信之前,需要确保两个蓝牙设备(例如,一台手机和一台蓝牙串口透传模块)之间已经成功建立了蓝牙连接。
配对和授权:在建立蓝牙连接之后,如果需要进行配对(Pairing)和授权(Authorization),则需要执行相应的配对和授权步骤。这确保了通信双方对彼此的身份进行验证和授权。
端口配置:在连接建立和授权完成后,进行端口配置以设置通信参数,如波特率、数据位、停止位、校验等。常见的配置方式是使用AT命令(如果蓝牙设备支持)或者通过蓝牙协议栈提供的API。
数据传输:一旦端口配置完成,通信双方可以开始进行数据传输。在SPP中,数据按字节流的方式进行传输,类似于传统的串口通信。发送方将数据通过蓝牙连接发送到接收方,并且接收方通过蓝牙连接接收和处理这些数据。
错误检测和纠正:在SPP通信中,数据传输过程中的错误可以使用CRC(循环冗余检测)等机制进行检测和纠正。这种机制可以帮助确保数据传输的准确性和可靠性。

需要注意的是,SPP协议只提供了基本的串口通信功能,并且在不同的蓝牙设备和应用中可能会有一些差异和扩展。因此,具体的通信过程还可能因设备和应用而异。对于深入理解和实现SPP协议,建议查阅相关的SPP规范和文档。

BLE协议(超低功耗应用蓝牙协议)

BLE(Bluetooth Low Energy)是一种低功耗蓝牙通信技术,被广泛应用于物联网和可穿戴设备等领域。BLE协议栈包含多个协议层,其中最重要的是GAP(Generic Access Profile)、GATT(Generic Attribute Profile)和ATT(Attribute Protocol)。

BLE通信过程大致如下:

建立连接:BLE通信的第一步是设备之间的连接。连接过程发生在GAP层,其中一个设备作为广播器(广播Adv)发送广告数据包,另一个设备作为扫描器(扫描Scan)接收广告数据包。通过广告和扫描,设备可以发现彼此并尝试建立连接。
建立连接参数协商:连接建立后,进行连接参数协商。双方协商通信的参数,如连接间隔、广播间隔和数据长度等。这些参数决定了通信速率和功耗。
发现服务和特征:连接成功后,扫描器设备可以通过GATT和ATT协议发现广播器设备上的服务和特征(Characteristics)。服务和特征提供了设备之间交换数据的接口。
特征值读写:一旦服务和特征被发现,扫描器可以读取或写入特征值进行数据交换。一个设备可以向另一个设备检索数据或发送数据。
订阅和通知:在某些情况下,设备可以通过订阅特征来接收数据的通知。当特征值有更新时,设备会收到通知或指示,以便进行相应的处理。

常见通用蓝牙模块

JDY-31-SPP

本文选用的蓝牙模块就是JDY-31,JDY31支持SPP协议,支持 AT 指令集。

HC05/06

更常用的HC05/06模块同样包含AT命令模式,价格要稍贵一些。HC05和06用法没有太大区别,HC05带复位按钮。

Keil 工程开发模版

使用Keil进行基于STM32的开发通常需要先创建一个基本工程模版,包含常用的库函数和头文件,之后再学习其他模块时直接更换模版中的main.c源文件内容即可。

读者可以下载本文创建好的工程附件直接烧录运行:
在这里插入图片描述

main.c 源文件:

//引用库函数头文件
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_crc.h"
#include "system_stm32f10x.h"
#include "stdio.h"

//函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void delay_ms(u16 time);

void UART_PutChar(USART_TypeDef* USARTx, uint8_t Data);
void UART_PutStr(USART_TypeDef* USARTx, uint8_t *str);
int Putchat(int c);

//主函数
int main()
{
	SystemInit();
	RCC_Configuration();
	GPIO_Configuration();
	USART_Configuration();

	while(1)
	{
		UART_PutStr(USART1, "Access successfully\r\n"); //打印信息
		delay_ms(1000);
	}
}

//函数定义
void RCC_Configuration(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE);
}
void GPIO_Configuration(void)  //串口引脚配置
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;  //定义PA9为TXD(发送引脚)通常使用推挽输出模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用功能(Alternate Function)推挽输出模式
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  //定义PA10为RXD(接收引脚)
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //复用功能(Input Pull-Up)输入上拉模式
	GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void USART_Configuration(void) //串口通信初始化配置
{
	USART_InitTypeDef USART_InitStructure;
	
	USART_InitStructure.USART_BaudRate = 9600;  //波特率设置
	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_Cmd(USART1,ENABLE);
}

void delay_ms(u16 time)
{
	u16 i=0;
	while(time--)
	{
		i = 12000;
		while(i--);
	}
}

int Putchar(int c)
{
	if (c == '\n'){putchar('\r');}
	USART_SendData(USART1,c);
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {};
	return c;
}

void UART_PutChar(USART_TypeDef*USARTx, uint8_t Data)
{
	USART_SendData(USARTx, Data);
	while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET) {};
}

void UART_PutStr(USART_TypeDef*USARTx, uint8_t *str)  //打印字符串函数定义
{
	while(0 != *str)
	{
		UART_PutChar(USARTx, *str);
		str++;
	}
}

接线方式:

MCU的PA9(TXD)连接蓝牙模块的RXD,PA10(RXD)连接蓝牙模块的TXD,
此外蓝牙模块还需要连接5V供电,5V电源可来源于直流稳压电源或市面上可购买到的电源模块;
MCU通过电源模块进行供电,并通过USB连接计算机进行烧录,BOOT1与BOOT0都连接到GND,在FlyMcu中点击开始编程后按下MCU的复位键后程序就烧录进去了。
在这里插入图片描述

烧录工具:FlyMcu

选择如下烧录方式将hex文件下载到MCU:
在这里插入图片描述

串口调试工具:XCOM

连接好MCU与蓝牙模块、计算机后,烧录程序,可在XCOM中查看到串口打印信息,说明连接正确。
在这里插入图片描述

蓝牙调试助手APP

安卓应用市场搜索SPP蓝牙串口APP,点击搜索可用设备,连接后选择编解码格式为 utf-8(默认为hex模式)防止显示乱码。

实验效果:

可以看到将移动设备端(手机)和MCU通过蓝牙连接后,可以正常接收打印出来的 “Access Successfully” 信息。
在这里插入图片描述
缺点:实验中发现通过JDY31蓝牙传输发送的信息误码率还是比较高的,经常会出现隔行乱码的情况。
在这里插入图片描述

参考:
STM32F103C8T6单片机HC-06蓝牙手机通讯实验NO.2
【半导体】一文读懂什么是BLE(超低功耗应用蓝牙协议)
【蓝牙模块】三款常用的基础蓝牙模块,HC05,JDY-31,CC2541介绍与测试说明
智能车从入门到入土(DAY1)————JDY31蓝牙模块的简单介绍
引用部分来源于VScode商店 - ChatMoss - GPT-3.5,使用教程:ChatMoss主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/810874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Yolov8训练自己的数据集合(最新实验数据)

一、安装环境 笔者环境如下: win10 anaconda python3.8二、clone代码 地址如下,可以直接使用git命令进行clone,也可以直接去网站下载 git clone https://github.com/ultralytics/ultralytics代码目录如下所示 三、安装必要的库 其实这里比较重要的是…

java的instanceof操作符

说明 java的instanceof操作符可以用于类型的比较或者模式匹配比较。instanceof关键字左边是对象的引用,右边是引用类型或者模式。 如果instanceof关键字右边是一个引用类型,那么instanceof关键字是一个类型比较操作符。 如果instanceof关键字右边是一个…

6.事件监听(绑定)

6.1事件监听 ●什么是事件? 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 ●什么是事件监听? 就是让程序检测是否有事件产生,一旦有事件触发,就立即调用一个函数做出响应,也称为绑定事件或者注册事件&…

FL Studio 21官方中文版功能介绍及2023最新下载详细图文安装激活教程。FL Studio 21需要系统配置要求

FL Studio 21版本更新现已发布,在这次更新中优化了很多功能,但这些现在都不重要,FL Studio21版本的这次更新中令人瞩目的更新莫过于对简体中文版的支持了。以前FL Studio只有英文版,想要用上中文版只有用汉化包,而且有…

某信用中心之加速乐实战分析

某信用中心之加速乐实战分析 某信用中心之加速乐实战分析声明逆向目标逆向分析第一层cookie获取第二层cookie获取调试分析JS文件 模拟执行致谢 某信用中心之加速乐实战分析 声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理&#x…

【二叉树进阶】搜索二叉树(递归+非递归两种版本详解)

文章目录 前言1. 二叉搜索树的概念2. 二叉搜索树的结构2.1 结点结构2.2 树结构 3. 插入操作(非递归)3.1 思路分析3.2 代码实现3.3 中序遍历(测试用) 4. 查找操作(非递归)4.1 思路分析4.2 代码实现 5. 删除操…

七大经典比较排序算法

1. 插入排序 (⭐️⭐️) 🌟 思想: 直接插入排序是一种简单的插入排序法,思想是是把待排序的数据按照下标从小到大,依次插入到一个已经排好的序列中,直至全部插入,得到一个新的有序序列。例如:…

Doc as Code (3):业内人士的观点

作者 | Anne-Sophie Lardet 在技术传播国际会议十周年之际,Fluid Topics 的认证技术传播者和功能顾问 Gaspard上台探讨了“docOps 作为实现Doc as Code的中间结构”的概念。在他的演讲中,观众提出了几个问题,我们想分享Gaspard的见解&#x…

深入学习 Redis - 渐进式遍历 scan 命令、数据库管理命令

目录 前言 一、scan 命令 二、数据库管理命令 select dbsize flushdb / flushall 前言 之前我们所了解到的 keys * 是一次性把整个 redis 中所有的 key 都获取到,但是整个操作比较危险,可能会一下子的都太多的 key,阻塞 redis 服务器. …

NLP(六十三)使用Baichuan-7b模型微调人物关系分类任务

任务介绍 人物关系分类指的是对文本中的两个人物,在特定的关系列表中,判断他们之间的人物关系。以样本亲戚 1837年6月20日,威廉四世辞世,他的侄女维多利亚即位。为例,其中亲戚为人物关系,威廉四世为实体1&a…

vins调试的注意事项

1、摄像头的内参和畸变矫正系数 这个系数不对,没法做,因为下一步没法做对。这个会导致系统无法初始化。 2、对畸变的像素点,求得归一化坐标的方法 理解不同矫正模型的原理,确保矫正对了,得到z1平面的去畸变点。 3、摄…

python皮卡丘编程代码教程,用python打印皮卡丘

大家好,小编来为大家解答以下问题,如何用print函数打印一只皮卡丘,用python如何打印丘比特之心,现在让我们一起来看看吧!

CCL 2023 电信网络诈骗案件分类评测-第一名方案

1 任务内容 1.1 任务背景 2022年12月1日起,新出台的《反电信网络诈骗犯罪法》正式施行,表明了我国治理当前电信网络诈骗乱象的决心。诈骗案件分类问题是打击电信网路诈骗犯罪过程中的关键一环,根据不同的诈骗方式、手法等将其分类&#xff…

13个ChatGPT类实用AI工具汇总

在ChatGPT爆火后,各种工具如同雨后春笋一般层出不穷。以下汇总了13种ChatGPT类实用工具,可以帮助学习、教学和科研。 01 / ChatGPT for google/ 一个浏览器插件,可搭配现有的搜索引擎来使用 最大化搜索效率,对搜索体验的提升相…

【机器学习】Linear Regression

Model Representation 1、问题描述2、表示说明3、数据绘图4、模型函数5、预测总结附录 1、问题描述 一套 1000 平方英尺 (sqft) 的房屋售价为300,000美元,一套 2000 平方英尺的房屋售价为500,000美元。这两点将构成我们的数据或训练集。面积单位为 1000 平方英尺&a…

C++ 类和对象篇(零) 面向过程 和 面向对象

目录 一、面向过程 二、面向对象 三、两种编程思想的比较 四、C和C 一、面向过程 1.是什么? 是一种以解决问题的过程为中心的编程思想。即先分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现。 2.为什么? 面向过程就纯粹是分析…

基于x-scan扫描线的3D模型渲染算法

基于x-scan算法实现的z-buffer染色。c#语言&#xff0c;.net core framework 3.1运行。 模型是读取3D Max的obj模型。 x-scan算法实现&#xff1a; public List<Vertex3> xscan() {List<Vertex3> results new List<Vertex3>();SurfaceFormula formula g…

SAP 自定义BADI增强点

应用场景 标准化代码中预留客制化部分&#xff0c;保证代码主体完整性&#xff0c;可以在预留增强位置预留两种类型的增强处理&#xff0c;其一为标准增强类型的&#xff0c;增强部分代码属于增加的逻辑&#xff0c;其二对于部分多样化的逻辑&#xff0c;使用优先执行默认逻辑&…

Java常用API:Object、Objects、包装类

Object类API toString 返回字符串类型 equals 默认比较的是地址 此时返回的是 false 可以在类中重写equals 方法 比较内容 如果内容一样就返回true clone 不能在测试类中用&#xff0c;必须在创建的类中重写克隆方法 还必须要有接口&#xff0c;说明这个对象有这个能力克隆 …

增量预训练baichuan-13b-chat遇到的那些坑

文章目录 前言资源deepspeed一、训练的坑二、推理的坑三、继续训练的坑总结前言 资源 单机两4090,如图 单卡24G,baichuan-13b-chat单卡推理需要至少26G,因此仅用一张卡,我们是无法加载百川13B的模型,所以,无论是推理还是训练,我们都必须并行! deepspeed 核心思想…