Bluetooth(HC)与STM32的连接通讯(在手机端通过蓝牙控制STM32板子小灯)

2023-11-18

一、说明:写本文的目的是抛弃一些比较专业的描述,从一些刚接触的小白角度出发,帮助此类朋友解决一些问题,所以内容都是用比较通俗的白话来写,网上已经有许多的比较专业的描述教程,若你想要一些比较专业性的描述,本人建议你看其他朋友的。

二、概论:本文内容主要是介绍如何在STM32上添加、使用蓝牙模块,介绍怎么将蓝牙与STM32联系起来,文章最后介绍一个实例。

三、硬件连接

1、连接图

实物连接图(看线的颜色)

如上图所示,该STM32具有三组串口管脚,自己选一组(具体看自己STM32板子的电路图,下面内容我只以RX1/TX1这组为例,不同组接下来的代码配置也会不同),至于VCC管脚和GND管脚自己找,板子上有标志。

首先说一下STM32板子在这里实现的功能本质——“串口通信”,和蓝牙模块在这里充当的角色——“串口客户端”

这个怎么理解呢? 简单来说,STM板子和蓝牙模块进行“微信聊天”,即都具有发送接收功能。

三、串口内容:

接完管脚了,接下来就是代码部分,串口功能总共五个函数(建议复制粘贴)

(1)通信初始化

void USART_Config(void)  
{  
    GPIO_InitTypeDef x;
    USART_InitTypeDef y;

   //打开时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

    x.GPIO_Pin=GPIO_Pin_9;
    x.GPIO_Mode=GPIO_Mode_AF_PP;
    x.GPIO_Speed=GPIO_Speed_50MHz;
    //初始化发送管脚
    GPIO_Init(GPIOA,&x);                  

    x.GPIO_Pin=GPIO_Pin_10;
    x.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    //初始化接收管脚
    GPIO_Init(GPIOA,&x);                  

    //注意波特率,否则会出现乱码
    y.USART_BaudRate=9600;      
    y.USART_WordLength=USART_WordLength_8b;
    y.USART_Parity=USART_Parity_No;
    y.USART_StopBits=USART_StopBits_1;
    y.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    //串口配置(波特率等)
    USART_Init(USART1,&y);                

    //打开串口接收中断
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    
    USART_Cmd(USART1,ENABLE);

    //配置串口中断的优先级
    NVIC_Configuration();    
} 

(2)配置串口中断优先级

void NVIC_Configuration()
{
    NVIC_InitTypeDef NVIC_InitStruct;    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    
    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStruct);
}

(3)写一下中断处理函数

void USART1_IRQHandler(void)
{
    uint8_t ucTemp;
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {
        ucTemp=USART_ReceiveData(USART1);
        USART_SendData(USART1,ucTemp);
    }
}

(4)重写输出输入函数(记得添加#include "stdio.h"哦)

#include "stdio.h"
int fputc(int ch,FILE *f)
{
    USART_SendData(USART1,(uint8_t)ch);
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    return (ch);
}
int fgetc(FILE *f)
{
    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
    return (int)USART_ReceiveData(USART1);
}

(5)最后当然是主函数了(记得包括上面的头文件总共有两个头文件哦)

#include "stm32f10x.h"
int main(void)  
{  
    USART_Config();
    while(1);
}

四、功能例子(在手机端通过蓝牙控制STM32板子小灯)

(1)配置串口(就是上面的代码)

(2)初始化小灯(我的STM32控制LED灯的管脚为PC13)

void LED_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStruct);
}

(3)小灯控制函数

//LED_G(0): 灯亮 | LED_G(1):灯灭
void LED_G(uint8_t n)                
{
    if(n)
        GPIO_SetBits(GPIOC, GPIO_Pin_13);
    else
        GPIO_ResetBits(GPIOC, GPIO_Pin_13);
}

(4)修改主函数

#include "stm32f10x.h"
int main(void)  
{  
    USART_Config();
    LED_GPIO_Config(); 
    while(1);
} 

(5)修改串口中断函数

//如果手机蓝牙发送‘0’则灯亮,(若其他数据)否则灯灭
void USART1_IRQHandler(void)  
{  
    u8 res;  
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  
    { 
        res= USART_ReceiveData(USART1);   
        USART_SendData(USART1,res);
        if(res=='0')
        {
            LED_G(0);
        }
        else
        {
            LED_G(1);
        }        
    }  
}

五、效果

六、资源

完整工程 链接:https://pan.baidu.com/s/18EuSGRANwR2XbEAwpQLwbg  提取码:x6v4

测试软件 链接:https://pan.baidu.com/s/1rX6GbTvHRU3Mb18tgwEjHg  提取码:td1d

七、后文

制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bluetooth(HC)与STM32的连接通讯(在手机端通过蓝牙控制STM32板子小灯) 的相关文章

随机推荐

  • Lunece全文检索搜索引擎

    Lunece全文检索 1 什么是全文检索 lucene是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 但它不是一个完整的全文检索引擎 而是一个全文检索引擎的架构 提供了完整的查询引擎和索引
  • Postman如何做接口测试,那些不得不知道的技巧

    目录 导读 前言 Postman如何做接口测试1 如何导入 swagger 接口文档 Postman如何做接口测试2 如何切换测试环境 Postman如何做接口测试3 什么 postman 还可以做压力测试 Postman如何做接口测试4
  • substance designer中的warp节点分析

    一直觉得warp挺适用 但是用起来有时候效果挺奇怪的 还有directional warp貌似两个产生的效果截然不同 于是尝试用u3d 材质实现下 directional warp 这个节点主要功能是用灰度信息推开像素 常常用来分割连续贴图
  • Ubuntu安装配置tftp服务器

    Ubuntu安装配置tftp服务器 实验环境 ubuntu 1604 x64 一 安装配置 建立tftp目录 sudo mkdir tftpboot sudo chmod 777 tftpboot 安装客户端和服务器 sudo apt ge
  • 大数据量的冒泡排序 (计次数)

    题目描述 给定一个包含从0到n 1各一次的数组 若使用冒泡排序将其排为升序 问其中需要进行多少次交换 输入 测试数据有多组 每组由两行组成 第一行包含正整数n n lt 5000 下一行包含从0到n 1的n个整数的序列 输出 对于每组测试数
  • [论文分享] Adversarial Training for Raw-Binary Malware Classifiers

    Adversarial Training for Raw Binary Malware Classifiers USENIX 2023 Keane Lucas Carnegie Mellon University Samruddhi Pai
  • 面试题61. 扑克牌中的顺子(java+python)

    从若干副扑克牌中随机抽 5 张牌 判断是不是一个顺子 即这5张牌是不是连续的 2 10为数字本身 A为1 J为11 Q为12 K为13 而大 小王为 0 可以看成任意数字 A 不能视为 14 示例 1 输入 1 2 3 4 5 输出 Tru
  • hex文件格式学习记录

    hex文件 hex文件是什么 hex文件的数据结构 按照记录类型具体分析 Mermaid Flowchart hex文件是什么 它是由一行行符合Intel HEX 文件格式的文本所构成的ASCII 文本文件 每一行包含一 个 HEX 记录
  • Java实验三 基于GUI的网络通信程序设计【代码构建逻辑】【双向通信】【超多细节优化!!】

    写在前面 这次实验代码的构建主要是更加熟练的运用socket网络编程 文件输入输出流 GUI设计 容器的使用 多线程的运用等等多方面的知识 是综合类题型 做完受益身心的类型 题目如下 编写程序完成以下功能 1 设计一个基于GUI的客户 服务
  • iOS的几个特效实现思路

    最近看一个app的源码 发现基本没有用第三方的开源组件 但是特效也做得不错 总结一下实现的思路 简单的抽屉效果 效果如图 这种抽屉效果很常见 开源组件也很多 但是一般开源组件都对Controller的结构有要求 有时候不是很方便 原理主要是
  • qmake手册(Qt5.9.3)

    qmake手册 qmake手册 概观 描述一个项目 建立一个项目 使用第三方库 预编译头文件 入门 从简单的开始 使应用程序可调试 添加平台特定的源文件 如果文件不存在停止qmake 检查多个条件 创建项目文件 项目文件元素 变量 注释 内
  • 小程序报错:Unexpected end of JSON input

    报错原因 跳转页面传参内包含英文 let data aaa 你学会了吗 由于参数内携带英文 所以报错 wx navigateTo url home home data encodeURI JSON stringify data 解决方法 先
  • ECCV20 - OCRNet:聚合对象上下文特征用于语义分割《Object-Contextual Representations for Semantic Segmentation》

    文章目录 原文地址 论文阅读方法 初识 相知 主要技术 部分实验 回顾 原文地址 原文 论文阅读方法 三遍论文法 初识 对于语义分割这类密集预测任务 上下文特征是非常重要的信息 在早期的一些工作中 主要着重于捕获多尺度特征 空间维度 比如P
  • Golang学习笔记 结构体和指针

    Golang是一门很特殊的语言 虽然它出生比较晚 但是在很多地方却和现在的编程语言有所不同 现在的编程语言要么是函数式的 要么是面向对象的 而Go语言却有指针 结构体这些概念 并解决了C语言的一些坑 从这个角度上说 Golang可以看做C语
  • 【mysql】-【innodb数据存储结构】

    文章目录 数据库的存储结构 页 磁盘与内存交互基本单位 页 页结构概述 页的大小 页的上层结构 页的内部结构 File Header 文件头部 和File Trailer 文件尾部 File Header 文件头部 38字节 File Tr
  • Vue3-导出excel表格

    安装xlsx和file saver yarn add file saver xlsx 或 npm install file saver S npm install xlsx S 页面引入xlsx和file saver import as X
  • 不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事...

    文章授权转载自视觉志 版权归原作者所有 作者 不一 2009年 19岁的孙玲和朋友一起 坐上了前往深圳的绿皮火车 经过14个小时的疲倦车程 她有了一个全新的身份 工厂车间 流水线上的一名女工 那个时候 如果有人告诉孙玲 你以后会成为一名优秀
  • 无限创建gmail邮箱账号

    文章目录 说明 准备工作 操作方法 1 用户名之间加 2 用户名后面加 3 把后缀变为http googlemail com 说明 国外很多网站都需要gmail邮箱注册 如果能有很多gmail账号 那么就能做很多事 自己体会哈 注册地址 h
  • Python 模块与包

    1 模块 一个模块就是一个包含python代码的文件 后缀名称是 py就可以 模块就是个python文件 为什么我们用模块 程序太大 编写维护非常不方便 需要拆分 模块可以增加代码重复利用的方法 当作命名空间使用 避免命名冲突 如何定义模块
  • Bluetooth(HC)与STM32的连接通讯(在手机端通过蓝牙控制STM32板子小灯)

    一 说明 写本文的目的是抛弃一些比较专业的描述 从一些刚接触的小白角度出发 帮助此类朋友解决一些问题 所以内容都是用比较通俗的白话来写 网上已经有许多的比较专业的描述教程 若你想要一些比较专业性的描述 本人建议你看其他朋友的 二 概论 本文