引言导读
-
本文适合小白简单入门,大神请绕行。想讲的尽量透彻,所以篇幅啰嗦,介意的绕行。 -
蓝牙模块基本是通用的,所以看这一篇教程,如果你的蓝牙模块与我的不一样,也不要担心,原理是通的。 -
蓝牙是通信的一种,故想要学好STM32与蓝牙连接,掌握一点点基本通信知识是需要的。 -
本次涉及到的硬件包括STM32F103C8T6最小系统板(其实其他版本都是可以的)和蓝牙模块买的是集芯微的BLE5.0(这家挺便宜,就是资料少,JDY-31,HC-06等都可以),此外还需要面包板和杜邦线若干。 -
买的蓝牙模块没有焊接排针,而且竟然是小号排针,又手残焊接不好。最后,买了锡膏和热风机焊接,小号排针用网线代替了(网线也可以当作杜邦线用)。不过锡膏有毒,所以焊接时候注意通风,使用时最好带手套或者之类的,具体自动百度或者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 双工和单工
通信类似于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 串行和并行
并行通信指双方之间通过多根信息线(8根以上)传输数据,数据可以并行传输,即公路很宽能够容纳多辆车并行行驶。 串行通信指双方之间通过很少根信息线(8根及以下)传输数据,数据犹如被一根线串起来的珍珠,所以叫做串行。
串行通信抗干扰能力强,线路铺设费用低,速率低。
1.3 异同通信和同步通信
为什么要有同步和异步,或者它们是怎么来的?要想回答这个问题,我们需要考虑一个场景:如何传输大量数据?这个问题是没有完美解决方法的,但是最优方法是:当传输线路等硬件既定时,在线路满负荷下可以最快完成数据传输,也就是说:发送方马不停蹄地发送数据,接收方也及时接收信息,同时为了尽可能保证数据传输安全性,接受方接受一个信息后要给一个是否成功接收的状态 ,发送方在接受这个状态后才能发送下一个信息。实现这种马不停蹄,最简单是双方按同一套时间步调一致发送、接收和检验信息,就像生产线一样,每个人在规定的时间内步调一致地完成各自的动作,以达到效率最高。这就是同步通信过程。
异步通信则是为了完成小数据量传输,比如操控遥控车,这种场景下通常发送方不定时地发送少量信息,接收方接收后无需回复。相比于同步通信这是不安全的,但是这无所谓,可以通过其他方式来修正这种不安全。比如:遥控汽车,因为某个因素,汽车没有接受到转向,那么人会再次操作一遍转向操作,问题不大。异步通信就不要求双方在同一套时间下进行同步操作,只要它们是相近的时间就好。但是,双方要有相同的波特率。
这里的时间,其实就是时钟周期,类似于人把时间分为年月周日时分秒,时钟周期是把1秒分为很多份,是芯片设备的时间。
习题
- 在异步通信中,为什么通常情况下,双方要保持一样的波特率?
二、连接STM32单片机
下面进入正题
2.1 编程环境
- CubeIDE
- 面包板和连接线
2.2 硬件接线
下面给出了接线图,
2.2.1 接线图
2.2.1 硬件介绍和设置
買的蓝牙模块如下图,其VDD GND 是接输入电源的正负极,他要求输入3.3V电压,我用的STM32板子上的电源。RXD TXD 是用于连接STM32板子的,RXD 是receive 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 手机控制二极管
- 搜索下载一款手机蓝牙调试助手,我用的是
BLE调试助手 这款APP。 - 按照蓝牙名字,搜索并连接上蓝牙,然后给蓝牙发送"1", 即可灯亮,发送其他则灯灭。
|