串行通信抗干扰能力强 , 线路铺设费用低,速率低 。
1.3 异同通信和同步通信为什么要有同步和异步,或者它们是怎么来的?要想回答这个问题,我们需要考虑一个场景:如何传输大量数据?这个问题是没有完美解决方法的 , 但是最优方法是:当传输线路等硬件既定时,在线路满负荷下可以最快完成数据传输,也就是说:发送方马不停蹄地发送数据 , 接收方也及时接收信息 , 同时为了尽可能保证数据传输安全性,接受方接受一个信息后要给一个是否成功接收的状态,发送方在接受这个状态后才能发送下一个信息 。实现这种马不停蹄,最简单是双方按同一套时间步调一致发送、接收和检验信息,就像生产线一样,每个人在规定的时间内步调一致地完成各自的动作,以达到效率最高 。这就是同步通信过程 。
异步通信则是为了完成小数据量传输,比如操控遥控车 , 这种场景下通常发送方不定时地发送少量信息,接收方接收后无需回复 。相比于同步通信这是不安全的,但是这无所谓,可以通过其他方式来修正这种不安全 。比如:遥控汽车,因为某个因素 , 汽车没有接受到转向 , 那么人会再次操作一遍转向操作 , 问题不大 。异步通信就不要求双方在同一套时间下进行同步操作,只要它们是相近的时间就好 。但是,双方要有相同的波特率 。
这里的时间,其实就是时钟周期,类似于人把时间分为年月周日时分秒,时钟周期是把1秒分为很多份,是芯片设备的时间 。
习题
- 在异步通信中 , 为什么通常情况下,双方要保持一样的波特率?
2.1 编程环境
- CubeIDE
- 面包板和连接线
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 */ }
推荐阅读
- C语言小白刷题
- Taurus.MVC 微服务框架 入门开发教程:项目部署:7、微服务节点的监控与告警。
- time使用 研一小白入坑Go
- olay淡斑小白瓶适合什么年龄_olay淡斑小白瓶适合年龄
- 麻将怎么玩(麻将怎么玩新手入门)
- 1 Python全栈工程师之从网页搭建入门到Flask全栈项目实战 - ES6标准入门和Flex布局
- Go Micro介绍与入门
- 数独入门,数独怎么玩(数独每日玩法)
- 9宫数独怎么玩入门(数独的9宫最快解答方法)
- MatrixOne从入门到实战04——MatrixOne的连接和建表