@

引言导读

  1. 本文适合小白简单入门,大神请绕行。想讲的尽量透彻,所以篇幅啰嗦,介意的绕行。

  2. 蓝牙模块基本是通用的,所以看这一篇教程,如果你的蓝牙模块与我的不一样,也不要担心,原理是通的。

  3. 蓝牙是通信的一种,故想要学好STM32与蓝牙连接,掌握一点点基本通信知识是需要的。

  4. 本次涉及到的硬件包括STM32F103C8T6最小系统板(其实其他版本都是可以的)和蓝牙模块买的是集芯微的BLE5.0(这家挺便宜,就是资料少,JDY-31,HC-06等都可以),此外还需要面包板和杜邦线若干。

  5. 买的蓝牙模块没有焊接排针,而且竟然是小号排针,又手残焊接不好。最后,买了锡膏和热风机焊接,小号排针用网线代替了(网线也可以当作杜邦线用)。不过锡膏有毒,所以焊接时候注意通风,使用时最好带手套或者之类的,具体自动百度或者bilibili。

一、通信基础知识

1.1 通信到底传输的是什么?

在逻辑层面,通信传输的是比特也就是二进制数。在物理层面上,当线路为电路时,发送方发送一个个持续小段时间的电压信号来表示这些二进制数,比如双方约定一个0.001秒的0V代表数字0,5V代表数字1,发送方发送先后发送两个持续0.001秒的0V和一个0.001秒的5V,就是相当于发送了001。这种持续一段时间的电压信号就是码元。当线路为无线电波时,码元就是一份份的电波了。由于电信号是一种波,所以可以认为我们在线路上传输了一个个波。

1.2 比特率和波特率

通信速度有多快呢?在逻辑层面上,用比特率(Bitrate)来衡量,它代表单位时间内传输的bit数量,单位是bit/s。在物理层面上,使用波特率(Baudrate),它表示单位时间内传输的码元(即,波)数量,码元就是上面的提到的电平信号,所以叫做波特率。通常下一个码元代表一个二进制数,这时比特率和波特率是相等。也有不等的时候,比如用0V表示0,2V表示1,4V表示2,6V表示3,这时候一个码元代表一个四进制数,则比特率是波特率的二倍。

习题

开放题目,言之成理即可,只考虑一般情形,不考虑特殊情况。

  1. 比特率和波特率的区别和联系?

1.1 双工和单工

通信类似于AB市通车,码元类似于一辆辆汽车。

名词 定义 例子
单工通信 通信线路是单向,从始至终都是发送方和接收方是固定的 车子只能从A市到B市,B市的车子不能开往A市。
双工通信 线路是双向,数据可以从A流向B,也可以从B流向A,即通信双方都可以发信息给对方,又可以分为半双工和全双工 A市的车可以开到B市,B市的车子也可以到A市。
全双工 线路全时段对双方开放,任何时间任何一方都可以发送信息给对方 AB市之间路很宽,两市间车子可以自由来往
半双工 线路只能在某段时间内对某方开放,双方轮流使用线路,即指某时间内,只能一方发送一方接受。 AB两个城市间公路很窄,只能容纳一辆车通行,AB两方约定8点-9点是车子只能从A市到B,9-10点是B市到A市,这样轮流交替。

单工和双工是对应的,按照线路是双向的还是单向的进行划分。

全双工和半双工是成对,他们是按照线路是否全时间段对双方开放使用。

全双工比半双工要复杂,效率高,发送数据多,成本更高。半双工要简单,双方需要约定好时间,不然会撞车

习题

开放题目,言之成理即可,只考虑一般情形,不考虑特殊情况。

  1. 两人交谈属于哪种通信?
  2. 校会上,校长发言属于哪种通信?
  3. 两人吵架属于哪种通信?
  4. 上课传纸条属于哪种通信?

1.2 串行和并行

并行通信指双方之间通过多根信息线(8根以上)传输数据,数据可以并行传输,即公路很宽能够容纳多辆车并行行驶。

串行通信指双方之间通过很少根信息线(8根及以下)传输数据,数据犹如被一根线串起来的珍珠,所以叫做串行。

串行通信抗干扰能力强,线路铺设费用低,速率低。

1.3 异同通信和同步通信

为什么要有同步和异步,或者它们是怎么来的?要想回答这个问题,我们需要考虑一个场景:如何传输大量数据?这个问题是没有完美解决方法的,但是最优方法是:当传输线路等硬件既定时,在线路满负荷下可以最快完成数据传输,也就是说:发送方马不停蹄地发送数据,接收方也及时接收信息,同时为了尽可能保证数据传输安全性,接受方接受一个信息后要给一个是否成功接收的状态,发送方在接受这个状态后才能发送下一个信息。实现这种马不停蹄,最简单是双方按同一套时间步调一致发送、接收和检验信息,就像生产线一样,每个人在规定的时间内步调一致地完成各自的动作,以达到效率最高。这就是同步通信过程。

异步通信则是为了完成小数据量传输,比如操控遥控车,这种场景下通常发送方不定时地发送少量信息,接收方接收后无需回复。相比于同步通信这是不安全的,但是这无所谓,可以通过其他方式来修正这种不安全。比如:遥控汽车,因为某个因素,汽车没有接受到转向,那么人会再次操作一遍转向操作,问题不大。异步通信就不要求双方在同一套时间下进行同步操作,只要它们是相近的时间就好。但是,双方要有相同的波特率。

这里的时间,其实就是时钟周期,类似于人把时间分为年月周日时分秒,时钟周期是把1秒分为很多份,是芯片设备的时间。

习题

  1. 在异步通信中,为什么通常情况下,双方要保持一样的波特率?

二、连接STM32单片机

下面进入正题

2.1 编程环境

  1. CubeIDE
  2. 面包板和连接线

2.2 硬件接线

下面给出了接线图,

2.2.1 接线图

2.2.1 硬件介绍和设置

買的蓝牙模块如上图,其VDD GND是接输入电源的正负极,他要求输入3.3V电压,我用的STM32板子上的电源。RXD TXD是用于连接STM32板子的,RXDreceive external data引脚,用于接收来自单片机的信息,TXD引脚用于向单片机发送信息。买的模块一般都附赠规格说明书,比如引脚、电压、模块默认蓝牙名字和波特率等。

STM32是通过USART连接蓝牙模块,UART属于异步全双工通信,包含两根线单向通信线,分别接上述提到的两个引脚。我用的是STM32F103C8T6芯片,它自带有三组USART,这里选用USART1,CubeIDE会自动选择PA10和PA9两个引脚与蓝牙进行通信。具体如下图:





2.3 编码

在这里添加如下代码:

  uint8_t rx = 0; // 定义一个无符号整形数,用于接收蓝牙发送的数据。
while (1)
{
/* USER CODE END WHILE */
// 用于接受来自蓝牙发来的数据。
// &huart1 是一个封装好的结构体,代表那两个引脚,HAL_UART_Receive函数会自动识别使用PA10进行接受数据。
// &rx,接收蓝牙信息放到rx中,由于rx是整形数字,直接传递给函数,传过去的只是副本,所以要传递其引用。
// 1,表示接受一个字节(8个二进制)。
// HAL_MAX_DELAY 表示接受一个蓝牙信号后,单片机就停下来死等下次接收蓝牙信息。
HAL_UART_Receive(&huart1, &rx, 1, HAL_MAX_DELAY); // rx == '1', 蓝牙传输过来的是一个字符1而不是数字。
if (rx == '1'){
HAL_GPIO_WritePin(GPIOA, LED_Pin, GPIO_PIN_SET); # 输出高电平,灯亮
}else{
HAL_GPIO_WritePin(GPIOA, LED_Pin, GPIO_PIN_RESET); # 输出低电平,灯灭
}
/* USER CODE BEGIN 3 */
}

编译代码并下载到单片机上。

2.3 手机控制二极管

  1. 搜索下载一款手机蓝牙调试助手,我用的是BLE调试助手这款APP。
  2. 按照蓝牙名字,搜索并连接上蓝牙,然后给蓝牙发送"1", 即可灯亮,发送其他则灯灭。

小白转行入门STM32----手机蓝牙控制STM32单片机点亮LED的更多相关文章

  1. WS2812B彩灯详细讲解篇(STM32 PWM+DMA控制 STM32 HAL库编程 循环延时控制多种控制方式)

    一.效果展示 观看演示效果:https://www.bilibili.com/video/BV1JT4y1P72Q 二. 基础认识 (一)  小理论 WS2812B是一种智能控制LED光源,将控制电路 ...

  2. 【蓝牙低功耗BLE】控制GPIO来点亮LED

    这节讲一下最简单的,也是最基础的东西.CC2540的IO操作,把PORT口当做GPIO来用,废话不多说,往下看. 1.硬件电路 硬件电路时最简单的,用一根GPIO去控制LED灯.因为GPIO作为out ...

  3. Arduino 各种模块篇 蓝牙模块 手机蓝牙控制Arduino LED灯

    解决方案. 条件: 1.手机android 商店下载 blueTerm 2.向arduino中载入如下代码: char val; ; void setup() { Serial.begin(); pi ...

  4. stm32之时钟控制

    本文提到的有以下内容: 时钟系统与总线矩阵 SysTick系统定时器 RTC实时时钟 看门狗定时器 通用定时器 一.时钟系统与总线矩阵 stm32F4的时钟树如下图所示: 在STM32中,有五个时钟源 ...

  5. STM32入门系列-使用库函数点亮LED,LED初始化函数

    要点亮LED,需要完成LED的驱动, 在工程模板上新建一个led.c和led.h文件,将其存放在led文件夹内.这两个文件需要我们自己编写. 通常xxx.c文件用于存放编写的驱动程序,xxx.h文件用 ...

  6. STM32入门系列-使用库函数点亮LED软硬件分析

    电路图分析 首先找来单片机的原理图,根据原理图进行相关的设计工作. 例如在上图中相同网络标号表示它们是连接在一起的,因此D1发光二极管阴极是连接在STM32的PC0管脚上,D2指示灯阴极连接在PC1管 ...

  7. [创业中, 寻求合作] 业务方向:车联网智能终端;APP蓝牙控制汽车;APP网络远程控制汽车 (联系电话:18503086002)

    擅长领域 手机APP蓝牙控制汽车方案 手机APP网络远程控制汽车方案 手机APP与汽车车机的文件极速传输技术 车载OBD终端 (后装) 智能TBOX终端,Base on Linux,使用车规级硬件加密 ...

  8. STM32学习笔记(一)——点亮一个LED

    引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到 ...

  9. 互联网智能门锁,手机蓝牙APP成为首选

    随着互联网门锁在行业中的普及,大家越加关注到门锁的实施和维护成本.我们在互联网智能门锁的调研中发现,网关联网的智能门锁,使用时需要依赖房间内的宽带上网线路,而断线后客户反馈问题较多.据某家分散式公寓的 ...

随机推荐

  1. PHP操作路由器

    用PHP操作路由器 我们经常会碰到需要自动换IP的需求,比方模拟点击投票,数据采集被封IP,Alexa作弊等等,也就是需要经常换IP的,我们都可以通过PHP控制路由器来换IP,这样就不需要用按键精灵搞 ...

  2. 使用Mpvue配合Weui开发面试题题库微信小程序,并且发布到正式环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_116 之前的一篇文章详细阐述了微信小程序开发的准备和入门以及环境搭建,这一次我们介绍如何将微信小程序如何上线,同时配合weui美化 ...

  3. AgileFontSet迅捷字体设置程序

    AgileFontSet迅捷字体设置程序-用户手册  AgileFontSet的完整代码,参见 https://www.cnblogs.com/ybmj/p/11683291.html 1.程序特点和 ...

  4. LuoguP4782 【模板】2-SAT 问题 (2-SAT)

    Not difficult, the only problem is how to deal with give 0/1 to the var. Tarjan offers the reverse t ...

  5. Word 分页符怎么使用

    当一页内容输入完之后,还留有很多空白区域没有填写,一直按回车键跳转到下一页显得复杂,并且回车键经过的地方都是段落. 可以手动添加分页符,使当前页跳转到下一页. 也可以使用快捷键Ctrl + Enter ...

  6. NPOI EXECL数据导入,日期格式调用DateCellValue取值时,二次或后续调用出现报错!

    NPOI version:2.5.1 EXCEL数据导入功能,第一次调用DateCellValue获得日期值OK,二次或后续调用出现报错"函数求值需要运行所有线程" 初步怀疑是版本 ...

  7. 第三十五篇:vue3,(组合式api的初步理解)

    好家伙, 来一波核心概念:数据劫持是响应式的核心 1.由set up开始 (1)vue3中的一个新的配置项,值为一个函数. (2)组件中所用的到的:数据,方法,计算属性均要配置在set up中. (3 ...

  8. 报错:selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: missing 'name'

    代码运行到这:driver.add_cookie(cookies),报错了 相信坑了不少人,接下来是解决办法 driver.add_cookie(cookies) cookies = { " ...

  9. Spring常用注解(SpirngBoot方面讲的更加详细)

    注解实现自动装配 使用注解须知: 导入约束,context约束 配置注解的支持 <?xml version="1.0" encoding="UTF-8"? ...

  10. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...