【STM32嵌入式系统设计与开发---拓展】——1_11_1串口通信(USART)

这里写目录标题

  • 1、一般我们都怎么进行通信的?
    • (1)串行通行(Serial Communication)
    • (2)并行通信
    • (3)无线网络通信
    • (4)网络通信
    • (5)现场总线通信
  • 2、串口通信之间对比?
  • 3、通信类型有哪些?异步/同步/半双工/全双工又是什么?
  • 4、怎么理解在串口通信?
  • 5、使用的时候需要配置什么?
    • 推挽输出和复用推挽输出怎么选?
    • 为什么用浮空输入?
    • 串口定义的结构体?
  • 6、为什么能够printf();?
    • 一预处理、二定义、三个函数?
    • 半主机模式又是什么?

1、一般我们都怎么进行通信的?

(1)串行通行(Serial Communication)

UART(Universal Asynchronous Receiver/Transmitter):实现方式:使用微控制器的UART模块,通过配置波特率、数据位、停止位和奇偶校验来进行通信。
应用场景:微控制器之间的通信,调试信息输出等。

SPI(Serial Peripheral Interface)
实现方式:配置主设备和从设备的SPI模块,设置时钟极性、时钟相位和数据传输速率。
应用场景:传感器、显示器、存储器等外设通信。

I2C(Inter-Integrated Circuit)
实现方式:配置I2C主从设备的地址,设置数据传输速率,并处理数据传输中的ACK/NACK信号。
应用场景:短距离设备间通信,如EEPROM、传感器等。

(2)并行通信

并口(Parallel Port)
实现方式:使用数据总线和控制信号线,传输多个数据位。通常在计算机和打印机等设备中使用。
应用场景:早期计算机与打印机、扫描仪等外围设备通信。

(3)无线网络通信

Bluetooth
实现方式:使用蓝牙模块(如HC-05、HM-10),进行配对和数据传输。
应用场景:短距离无线通信,如无线耳机、键盘、鼠标等。

Wi-Fi
实现方式:使用Wi-Fi模块(如ESP8266、ESP32),配置SSID和密码,通过TCP/IP协议进行数据传输。

Zigbee
实现方式:使用Zigbee模块(如XBee),配置网络ID和通道,通过Zigbee协议进行数据传输。
应用场景:低功耗无线通信,智能家居、传感器网络。

(4)网络通信

以太网(Ethernet)
实现方式:使用以太网模块(如ENC28J60、W5500),配置IP地址、子网掩码和网关,通过TCP/IP协议进行数据传输。

应用场景:有线局域网、工业自动化系统。
光纤通信(Fiber Optic Communication)
实现方式:使用光纤收发模块,通过光纤传输数据,适用于高速和长距离通信。
应用场景:高速数据传输、远距离通信。

(5)现场总线通信

Modbus
实现方式:使用Modbus协议库,通过串口、以太网等接口进行主从通信。
应用场景:工业自动化和控制系统。

Profibus
实现方式:使用Profibus接口卡和协议栈,配置站地址和波特率。
应用场景:工厂自动化和过程控制。

2、串口通信之间对比?

在这里插入图片描述

3、通信类型有哪些?异步/同步/半双工/全双工又是什么?

在这里插入图片描述

4、怎么理解在串口通信?

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大地扩展了单片机的应用范围,
增强了单片机系统的硬件实力
简单双向串口通信有两根通信线(发送端TX和接收端RX)
TX与RX要交叉连接
当只需单向的数据传输时,可以只接一根通信线
当电平标准不一致时,需要加电平转换芯片

在这里插入图片描述

5、使用的时候需要配置什么?

波特率:串口通信的速率
起始位:标志一个数据帧的开始,固定为低电平
数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
校验位:用于数据验证,根据数据位计算得来
停止位:用于数据帧间隔,固定为高电平

在这里插入图片描述
在这里插入图片描述

/*********************************************************************@Function  : USART1初始化@Parameter : bound : 波特率 @Return    : N/A
**********************************************************************/   	
void usart1_init(uint32_t bound)
{	GPIO_InitTypeDef GPIO_InitStructure; // 定义一个 GPIO 初始化结构体USART_InitTypeDef USART_InitStructure; // 定义一个 USART 初始化结构体/*时钟使能*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); // 使能 USART1 和 GPIOA 的时钟/*引脚复用*/  //PA9->TXD GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;         // 配置 GPIOA 的引脚 9 为 USART1 的 TX 引脚GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置引脚速度为 50 MHzGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 设置引脚模式为复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);            // 初始化 GPIOA 引脚 9/*引脚复用*/  //PA10->RXDGPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;            // 配置 GPIOA 的引脚 10 为 USART1 的 RX 引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 设置引脚模式为浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);                // 初始化 GPIOA 引脚 10 /*USART设置*/USART_InitStructure.USART_BaudRate = bound;                 // 设置 USART 波特率USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 设置 USART 字长为 8 位USART_InitStructure.USART_StopBits = USART_StopBits_1;      // 设置停止位为 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 模式为接收和发送模式USART_Init(USART1, &USART_InitStructure);                         // 初始化 USART1USART_Cmd(USART1, ENABLE);                                       // 使能 USART1                  
}

推挽输出和复用推挽输出怎么选?

复用推挽输出用于当一个 GPIO 引脚需要执行特定外设功能(如串口通信的发送引脚)时,使引脚能够在高低电平之间切换并与外设模块共享;在 USART 通信中,TX 引脚配置为复用推挽输出是因为它需要由串口模块驱动以发送数据,实现串口通信功能

推挽输出(Push-Pull Output):用于简单的数字输出,比如控制一个 LED 的亮灭。它只是在高电平和低电平之间切换。

复用推挽输出(Alternate Function Push-Pull Output):用于引脚需要执行特定功能(比如串口通信)的情况。除了在高低电平之间切换,还能和外设模块(比如串口、I2C、SPI)共享,引脚不再只是普通的输入输出,而是用来传输数据。

为什么用浮空输入?

浮空输入的优势包括:
可以检测到微弱的信号:由于浮空输入的端口阻抗很大,类似于电压表内阻很大的情况,这样可以更灵敏地检测到外部信号的变化。
适用于多种标准通讯协议:例如 IIC、USART 等总线设备,在这些应用中,浮空输入有助于保证数据传输的准确性和稳定性。

串口定义的结构体?

/**
@brief USART 初始化结构体定义
*/
typedef struct
{
uint32_t USART_BaudRate; /* 此成员配置 USART 通信波特率。 */uint16_t USART_StopBits; /* 指定传输的停止位数量。*/
*/
uint16_t USART_Parity; /*!< 指定奇偶校验模式。 */
uint16_t USART_Mode; /* 指定接收或发送模式是启用还是禁用。 */
uint16_t USART_HardwareFlowControl; /* 指定硬件流控制模式是启用还是禁用。*/
} USART_InitTypeDef;

6、为什么能够printf();?

将printf重定向到USART1(串口1)–这样我们就能通过串口1将信息打印到上位机(串口助手)

//加入以下代码,支持printf函数,而不需要选择use MicroLIB	  
#if 1
#pragma import(__use_no_semihosting)             
/*********************************************************************@Function  : 标准库需要的支持函数 @Parameter : N/A@Return    : N/A
**********************************************************************/              
struct __FILE 
{ int handle; 
}; FILE __stdout;   /*********************************************************************@Function  : 定义_sys_exit()以避免使用半主机模式@Parameter : X :@Return    : N/A
**********************************************************************/   
void _sys_exit(int x) 
{ x = x; 
} /*********************************************************************@Function  : 重定义fputc函数@Parameter : ch :入口数据f :入口指针@Return    : ch :入口数据
**********************************************************************/
int fputc(int ch, FILE *f)
{      while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   USART1->DR = (u8) ch;      return ch;
}
#endif 

一预处理、二定义、三个函数?


1预、#pragmaimport(__use_no_semihosting),确保不从C库中使用半主机函数
2定、定义:__FILE结构体,避免HAL库某些情况下报错
定义: FILE_stdout,避免编译报错实现
3函数、_sys_exit和fputc(int ch, FILE *f)等三个函数


A[开始] --> B{是否调用 printf 函数}
B -->|是| C[进入 fputc 函数]
C --> D{串口是否发送完毕}
D -->|否| C
D -->|是| E[返回 printf 函数]
E --> F[继续程序执行]
B -->|否| F
graph TD
A[开始] --> B{是否调用 printf 函数}
B -->|是| C[进入 fputc 函数]
C --> D{串口是否发送完毕}
D -->|否| C
D -->|是| E[返回 printf 函数]
E --> F[继续程序执行]
B -->|否| F

半主机模式又是什么?

半主机模式就是在开发ARM单片机程序的时候,让程序能借用电脑(就是开发用的那台电脑)的屏幕来显示输出内容,比如用printf函数输出的东西能在电脑屏幕上看到,还能通过电脑的键盘给程序输入内容。
但真正把程序放到嵌入式设备里运行的时候,设备可没法直接用电脑的这些输入输出功能了,所以就得把这个模式关掉。不然程序可能会因为找不到电脑的帮忙而出问题。

半主机模式就好比是在开发单片机程序时,开了个“后门”,能让程序把要输出的东西,比如像用printf输出的那些文字,都发到我们用来开发的电脑屏幕上显示,也能通过电脑键盘给程序输入东西。
可等程序真正装到单片机里运行的时候,单片机可没法跟开发用的电脑连着了,这时候要是还开着这个“后门”,程序就会找不到地方去显示输出或者接收输入,就会乱套。所以得把这个模式关掉

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

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

相关文章

Django [实战] 通过表单上传文件

在Django中上传文件通常涉及到以下几个步骤&#xff1a; 设置你的模型以包含一个FileField或ImageField&#xff08;如果上传的是图片&#xff09;。创建一个表单&#xff0c;该表单包含一个Form或ModelForm&#xff0c;其中包含一个FileField。在你的视图中处理上传的文件。在…

Modbus转BACnet/IP网关快速对接Modbus协议设备与BA系统

摘要 在智能建筑和工业自动化领域&#xff0c;Modbus和BACnet/IP协议的集成应用越来越普遍。BA&#xff08;Building Automation&#xff0c;楼宇自动化&#xff09;系统作为现代建筑的核心&#xff0c;需要高效地处理来自不同协议的设备数据&#xff0c;负责监控和管理建筑内…

可以免费合并pdf的软件 合并pdf文件的软件免费 合并pdf的软件免费

在数字化办公的今天&#xff0c;pdf格式因其稳定性和跨平台兼容性被广泛使用。然而&#xff0c;当我们需要将多个 pdf 文件合并为一个时&#xff0c;却往往感到力不从心。本文将为你介绍几款强大的pdf文件合并软件&#xff0c;让你轻松管理文档。 方法一、使用pdf转换器 步骤1…

easyExcel和poi的版本对应

easypoi3.0.5对应的poi版本_easypoi和poi版本对应-CSDN博客 https://github.com/alibaba/easyexcel/blob/v3.2.0/pom.xml 解决 java.lang.NoClassDefFoundError: org/apache/poi/POIXMLTypeLoader 报错-CSDN博客 参考这个文档解决的- 引入最佳版本是3.15版本 java.lang.NoClas…

微服务:网关

网关 网关,即网络的关口,当一个网络传输到另一个网络时就需要经过网关来实现 数据的路由和转发 以及 数据安全的校验 网关技术实现 SpringCloudGateWay: 基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强 SpringCloudGateWay 依赖 <!--网关--><depe…

JAVA毕业设计152—基于Java+Springboot+vue+小程序的个人健康管理系统小程序(源代码+数据库+15000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue小程序的个人健康管理系统小程序(源代码数据库15000字论文)152 一、系统介绍 本项目前后端分离带小程序(可以改为ssm版本)&#xff0c;分为用户、管理员两种…

Ubuntu下载jdk:cannot execute binary file

虚拟机上Ubuntu系统安装jdk且配置环境之后&#xff0c;java -version显示cannot execute binary file&#xff0c;多番查阅推测是由于系统和jdk版本不兼容的原因。 uname -m查看系统版本位i686&#xff0c;是32位的&#xff0c;和64位的jdk版本不兼容。因此&#xff0c;下载32位…

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考&#xff1a; 5种CSS实现渐变色边框&#xff08;Gradient borders方法的汇总

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间&#xff0c;是Ascensio System SIA公司出品的&#xff0c;基于Web的&#xff0c;开源的&#xff0c;跨平台的&#xff0c;在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套&#xff1a;文档编辑器、幻灯片编辑…

FPGA实验1:简单逻辑电路

一、实验目的及要求 学习Create-SOPC实验平台的使用方法&#xff1b;熟悉Quartus II 软件平台和使用 VHDL 语言设计电路的方法&#xff1b;学习简单逻辑电路的设计、仿真和硬件测试。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计半加器&#xff0c;进行波…

LInux工具(2)

目录 1.关于底行模式的一个设置 1.1设置行号 1.2取消行号 2.简单vim配置 2.1简单认识 2.2配置选项 2.3其他说明 3.库的引入 3.1背景知识 3.2对应指令 3.3相关介绍 3.4.o文件和库的链接 3.5静态库的安装和测试 3.6动静态库对比 1.关于底行模式的一个设置 1.1设置行…

黑马点评-Postman卡住sending Requst原因解决

不知道为什么&#xff0c;用这个c1e1d5的token就会一直卡死&#xff0c;但是换了一个token就解决了&#xff0c;目前不知道为什么 解决了&#xff0c;原来是这个请求下面的函数发生了死循环&#xff01;&#xff01;太瓜皮了我超&#xff01; 把num写成了count&#xff0c;导…

函数(递归)

递归&#xff1a;程序调用自身编程技巧称为递归。 在学习递归前需要粗略的了解一下内存&#xff0c;内存分为三类&#xff0c;分别是栈区、堆区和静态区。对于栈区来说&#xff0c;每调用一次函数都会为本次函数开辟一块空间&#xff0c;然而栈区也是有空间限制的&#xff0c;随…

Golang | Leetcode Golang题解之第242题有效的字母异位词

题目&#xff1a; 题解&#xff1a; func isAnagram(s, t string) bool {if len(s) ! len(t) {return false}cnt : map[rune]int{}for _, ch : range s {cnt[ch]}for _, ch : range t {cnt[ch]--if cnt[ch] < 0 {return false}}return true }

Temporal-Kit 及 Ebsynth-流程

https://www.youtube.com/watch?vBL77HVIviJM 预处理 Ebsynth-流程

全国区块链职业技能大赛第八套区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 医疗健康平台中涉及到医院、医生、患者等参与方,他们需要在区块链医疗健康平台中完成账户注册、身份上链、挂号就诊、查询病例等多种业务活动。通过对业务活动的功能分析,可以更好的服务系统的开发流程。基于医疗健康平台系统架构,以…

【SpringBoot配置文件application.yaml】笔记

详细内容见官方文档Common Application Properties 使用application.yaml进行简单配置 第一步&#xff1a;创建WebDemo第二步&#xff1a;创建application.yaml配置文件注意&#xff1a; 第三步&#xff1a;验证自己创建的yaml文件是否生效测试&#xff1a;思考&#xff1a;如…

MT7628指定分区备份固件

为了避免升级过程突然断电&#xff0c;或者其他不良操作导致的路由器“变砖”。在MT7628使用过程中&#xff0c;我们可以对固件进行备份。 MT7628原厂SDK有关于双备份的选项&#xff0c;选择对应选项后&#xff0c;可对固件进行备份。下面以SKYLAB的SKW92A模组为例进行测试说明…

【专项刷题】— 快排

1、颜色分类 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 创建三个指针&#xff0c;然后把数组分为三个区域遍历代码&#xff1a; class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…

百度网盘Android一二面凉经(2024)

百度网盘Android一二面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《百度网盘Android一二面凉经(2024)》。 面试职位: 网盘主端研发组_Android高级研…