STM32串口通信
- 1.通信基础知识
- 1.1 时钟信号区分
- 同步通信
- 异步通信
- 波特率
- 总线协议(电气协议)
- 1.2 通信方式划分
- 串行通信
- 并行通信
- 1.3 通信方向划分
- 单工通信
- 半双工通信
- 全双工通信
- 常见通信总结
- 2. USART
- USART 介绍
- 3. 串口通信协议
- 4. 相关寄存器
- 串口控制寄存器
- 波特率寄存器
- 中断和状态寄存器
- 数据发送寄存器
- 数据接收寄存器
- 5. USART功能框图
- 6. 串口发送练习
- 1. 要求
- 2. STM32CubeMX配置
- 3. 代码编写
- 1.实现字符发送函数 Uart_Putchar()
- 2.实现字符串发送函数 Uart_Puts()
- 3.发送字符串“helloworld”
- 7. 串口收发练习
- 要求
- 代码编写
- 1. 实现字符接收函数 Uart_Getchar()
- 2.实现字符串接收函数 Uart_Gets()
- 3.实现收发功能
- 8. HAL库函数
- 使用HAL库函数实现串口收发
- 9. printf的重定向
1.通信基础知识
1.1 时钟信号区分
时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。
时钟信号有以下几个重要的方面:
-
频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为单位表示,表示每秒钟的周期数。高频时钟信号可以提供更快的数据传输速率和系统响应速度。
-
周期:时钟信号的周期是指信号从一个状态到另一个状态所经历的时间。它是频率的倒数,表示一个完整的信号周期所需的时间。
-
占空比:占空比是指时钟信号高电平(或低电平)所占整个周期的比例。它描述了时钟信号中高电平和低电平的时间分配比例。通常用百分比表示,例如50%表示高电平和低电平时间相等。
-
相位:相位是指时钟信号与参考信号之间的时间差。它用来协调不同时钟域之间的数据传输,确保在正确的时间进行操作。
时钟信号可以由外部晶体振荡器、晶体时钟发生器、PLL(锁相环)等电路产生。在数字系统中,各个组件如处理器、存储器、外设等都依赖于时钟信号来进行协调和同步操作。
适当的时钟设计和管理对于确保系统的正确功能和稳定性非常重要。因此,在电路设计和通信系统中,时钟信号的频率、相位、占空比等参数需要仔细考虑和配置,以满足系统需求。
同步通信
通信双方根据同步信号通信,比如双方有一个共同的时钟信号(SPI全双工 I2C半双工)
同步通信是一种数据传输方式,其中数据的传输和接收是在发送和接收设备之间基于共享的时钟信号进行同步的。
在同步通信中,发送设备和接收设备之间使用相同的时钟信号来协调数据的传输和接收。发送设备根据时钟信号的边沿将数据推送到传输线上,接收设备在相应的时钟边沿上读取数据。这种同步机制确保了数据在发送和接收设备之间以同步的方式进行传输,使得接收设备能够准确地按照发送设备发送的时钟边沿来读取数据。
同步通信通常需要发送和接收设备之间保持高度一致的时钟频率和相位。任何时钟信号的抖动或不一致性都可能导致数据传输错误或丢失。
一些常见的同步通信接口包括:
- 同步串行接口(Synchronous Serial Interface):如SPI(Serial Peripheral Interface)和I2S(Inter-IC Sound)。
- 同步并行接口(Synchronous Parallel Interface):如SDRAM(Synchronous Dynamic Random-Access Memory)接口和Parallel ATA(Advanced Technology Attachment)接口。
异步通信
通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同步(UART)
异步通信是一种数据传输方式,其中数据的传输和接收是通过引入起始位和停止位来同步的,而不依赖于共享的时钟信号进行同步。
在异步通信中,发送设备将数据帧分成一系列的数据位,并在每个数据帧的起始处插入一个起始位,以指示数据传输的开始。接收设备在检测到起始位后开始接收数据,并在数据帧的结束处检测到停止位,以指示数据传输的结束。
异步通信不需要发送和接收设备之间共享的时钟信号,而是通过引入起始位和停止位来同步数据传输。起始位和停止位的边沿提供了数据的时序参考点,使得接收设备能够在正确的时间窗口内接收和解析数据。
一些常见的异步通信接口包括:
- 串行通信接口(Serial Communication Interface):如UART(Universal Asynchronous Receiver-Transmitter)。
- USB(Universal Serial Bus):USB通信中的数据传输也是基于异步通信的原理。
波特率
每秒传输的数据位数 bps bit/s 1Byte = 8bit
波特率(Baud Rate)是指在串行通信中,单位时间内传输的数据位数。它表示了数据信号的传输速率或数据传输的速度。
波特率通常以单位时间内传输的比特数(bits per second,bps)来表示,也可以用赫兹(Hz)来表示,因为波特率与信号的频率相关。例如,一个波特率为9600 bps的串行通信意味着每秒传输9600个数据位。
波特率的选择取决于具体的通信需求和设备支持。较高的波特率可以提供更快的数据传输速度,但也要求发送和接收设备能够支持相应的速率。在进行串行通信时,发送和接收设备必须以相同的波特率进行配置,以确保数据的正确传输和解析。
需要注意的是,波特率只是表示数据传输的速率,而不同通信协议可能使用不同的编码方式和帧结构来表示数据。因此,在配置串行通信时,除了设置波特率之外,还需要确保其他参数(如数据位数、停止位数、校验位等)的一致性,以使数据能够正确地解析和处理。
常见的波特率值包括1200 bps、2400 bps、4800 bps、9600 bps、19200 bps、115200 bps等
总线协议(电气协议)
总线协议(电气协议)是指在计算机系统、通信系统和其他电子设备中,用于在设备之间进行数据传输和通信的规范或标准。以下是一些常见的总线协议:
-
UART(Universal Asynchronous Receiver-Transmitter):UART是一种常见的异步串行通信协议,常用于串口通信,它通过引入起始位和停止位来同步数据传输。
-
SPI(Serial Peripheral Interface):SPI是一种同步串行通信协议,通常用于连接微控制器和外部设备,支持全双工通信和多从设备的配置。
-
I2C(Inter-Integrated Circuit):I2C是一种串行通信总线协议,用于连接微控制器、传感器和其他外部设备。它支持多主机和多从设备的通信,并具有简单的硬件连接和配置。
-
CAN(Controller Area Network):CAN是一种在汽车和工业控制系统中广泛使用的串行通信协议,支持多节点通信、实时性和容错性。
-
Ethernet:Ethernet是一种广泛应用于局域网(LAN)和广域网(WAN)的通信协议,用于高速数据传输和互联网连接。
-
USB(Universal Serial Bus):USB是一种通用的串行总线协议,用于连接计算机和外部设备,支持高速数据传输和多种设备类型的连接。
-
HDMI(High-Definition Multimedia Interface):HDMI是一种高清晰度多媒体接口,用于音视频传输,常用于连接显示器、电视和多媒体设备。
-
PCIe(Peripheral Component Interconnect Express):PCIe是一种高速串行总线协议,用于连接计算机内部的扩展卡和外部设备,支持高带宽和低延迟的数据传输。
这只是一些常见的总线协议示例,实际上还有许多其他的总线协议和标准,每种协议都有不同的特性和适用场景,根据具体的应用需求选择适当的协议非常重要。
RS-485、RS-232和TTL是常见的串口通信标准和电平级别,它们在串口通信中使用不同的电气特性和信号级别。
-
RS-485(Recommended Standard 485):RS-485是一种常见的串口通信标准,常用于远距离、多节点的串口通信。RS-485使用差分信号传输,其中两根信号线(A线和B线)分别传输正相位和反相位的数据。RS-485支持多节点通信,允许一个发送器与多个接收器进行通信,并且可以实现半双工或全双工的通信方式。
-
RS-232(Recommended Standard 232):RS-232是一种常见的串口通信标准,定义了信号线的连接、电气特性和通信协议。RS-232使用正负电平表示逻辑1和逻辑0,其中正电平表示逻辑0,负电平表示逻辑1。RS-232通常使用DB-9或DB-25连接器,并用于连接计算机和外部设备(如调制解调器、打印机等)。
-
TTL(Transistor-Transistor Logic)电平:TTL电平是指逻辑电平使用晶体管-晶体管逻辑(TTL)技术实现的电平。TTL电平使用低电平表示逻辑0,通常定义为0-0.8V,而使用高电平表示逻辑1,通常定义为2.0-5.0V。TTL电平通常在数字电路和嵌入式系统中使用,如微控制器与传感器、显示屏等设备之间的通信。
TTL电平:(5v) 1: 2.4 ~ 5V 0 : 0 ~ 0.5V
RS-232:RS232电平 1:-15 ~ -3V 0:+3 ~ +15V
RS-485 :半双工、是电气协议(逻辑1:+2V – +6V 逻辑0: -6V — 2V)是二线制差分信号,也就是实际传输的数据是通过判断这两条信号线上的电压差来实现的,485的通讯距离,可以达到几千米
1.2 通信方式划分
串行通信
串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。
串行传输:数据按位顺序传输。
优点:占用引脚资源少
缺点:速度相对较慢
串行通信是一种数据传输方式,其中数据位逐位地按照顺序传输,而不是同时传输多个数据位。在串行通信中,数据位依次发送或接收,并且在每个数据位之间使用特定的控制信号进行同步。
串行通信相对于并行通信而言,使用的连接线较少,但数据传输速率较低。它适用于需要相对较低传输速率和简单的物理连接的应用场景。
串行通信可以根据同步方式和传输方式进一步细分,常见的串行通信接口包括:
-
UART(Universal Asynchronous Receiver-Transmitter):UART是一种常见的异步串行通信接口,其中数据的传输和接收是通过引入起始位和停止位来同步的。UART通常用于串口通信。
-
SPI(Serial Peripheral Interface):SPI是一种同步串行通信接口,通常用于连接微控制器和外部设备。它支持全双工通信,使用主从模式,其中一个设备充当主设备,其他设备充当从设备。
-
I2C(Inter-Integrated Circuit):I2C是一种串行通信总线接口,用于连接微控制器、传感器和其他外部设备。I2C支持多主模式和多从模式,允许多个设备在同一总线上进行通信。
-
USB(Universal Serial Bus):USB是一种通用的串行通信接口,用于连接计算机和外部设备。USB支持高速数据传输和多种设备类型的连接。
并行通信
并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
并行传输:数据各个位同时传输。
优点:速度快
缺点:占用引脚资源多
并行通信是一种数据传输方式,其中多个数据位同时通过各自的数据线进行传输。与串行通信相比,它可以在同一时钟周期内同时传输多个数据位,从而实现更高的数据传输速率。
在并行通信中,每个数据位使用一个独立的数据线,通常以二进制形式传输。数据位的数量由并行通信接口的设计决定,常见的有8位并行通信和16位并行通信。
并行通信在计算机系统、数据总线和其他高速数据传输应用中广泛应用。例如,在计算机内部,CPU和内存之间的数据传输通常采用并行通信。并行通信还用于高速外设接口,如并行接口打印机和并行显示接口。
然而,与串行通信相比,并行通信需要更多的物理连接线,占用更多的资源。此外,随着数据位数的增加,时序和同步问题也会变得更加复杂。因此,并行通信通常在短距离、高速数据传输和对时序要求较高的应用中使用,而串行通信更适用于较长距离和相对较低的数据传输速率。
1.3 通信方向划分
单工通信
要么收,要么发,只能做接收设备或者发送设备。比如收音机
单工通信是一种通信方式,其中数据只能在一个方向上进行传输,无法进行双向通信。在单工通信中,一方作为发送方,另一方作为接收方,数据只能从发送方流向接收方,而无法从接收方返回发送方。
在单工通信中,发送方负责发送数据,而接收方负责接收数据,但接收方无法对发送方进行任何响应或回复。这种通信方式适用于只需要单向数据传输的应用场景,例如广播、单向监视和数据传输到一个方向的传感器系统。
值得注意的是,单工通信不具备数据的双向交互能力,因此发送方无法确认数据是否已经成功到达接收方,也无法接收来自接收方的反馈或确认信息。如果需要双向通信或数据的可靠传输,可以考虑使用半双工或全双工通信方式。
半双工通信
可以收,可以发,但是不能同时收发, 比如对讲机
半双工通信是一种通信方式,其中数据可以在两个方向上进行传输,但不能同时进行。在半双工通信中,通信的两个方向可以交替地进行数据传输,但不能同时进行。
在半双工通信中,设备可以既充当发送方又充当接收方,但在特定的时间段内,一个设备只能发送数据,而另一个设备只能接收数据。这意味着数据的传输是双向的,但不能同时进行。例如,当设备A发送数据时,设备B只能接收数据;当设备B发送数据时,设备A只能接收数据。
半双工通信通常用于需要双向通信但数据传输量相对较小或通信需求不频繁的应用场景。它比单工通信具有更强的通信能力,但与全双工通信相比,数据传输速率较低,并且需要设备之间进行时序约定以实现交替传输。
半双工通信常见的应用包括对讲机、对手动指令的响应和局域网以太网的半双工模式。在这些应用中,设备之间可以在需要时进行双向通信,但无法同时进行数据传输。
全双工通信
可以在同一时刻既接收,又发送。 手机
全双工通信是一种通信方式,其中数据可以在两个方向上同时进行传输,允许双方同时进行双向的数据交互。在全双工通信中,发送方和接收方可以同时发送和接收数据,实现双向的数据流动。
在全双工通信中,通信设备可以同时充当发送方和接收方,无需交替进行数据传输。这意味着数据可以在两个方向上同时传输,而不会相互干扰。例如,当设备A发送数据时,设备B可以同时接收数据,并且设备B可以在同一时间段内发送数据,而设备A可以同时接收数据。
全双工通信具有较高的数据传输能力和灵活性,可以实现高速的双向数据传输。它适用于需要频繁的双向通信和较高数据传输速率的应用场景。例如,计算机网络中的以太网就是一种常见的全双工通信方式,允许计算机之间进行双向的高速数据传输。
然而,全双工通信需要设备支持双向数据传输,并且需要具备足够的带宽和资源来实现同时的发送和接收。通常,全双工通信需要使用独立的数据线路或信道来分别进行发送和接收数据。
常见通信总结
2. USART
USART 介绍
通用同步异步收发器(USART)提供了一个灵活的方式,使 MCU 可以与外部设备通过工业
标准 NRZ 的形式实现全双工异步串行数据通讯。 USART 可以使用分数波特率发生器,提供
了超宽的波特率设置范围。
USART 支持同步通讯模式和半双工单线通讯。 也支持 LIN(本地互联网络),智能卡协议和
IrDA(红外数据协会)SIR ENDEC 规范和 modem 流控操作(CTS/RTS)同时还 支持多机通
讯方式。
可以使用 DMA 实现多缓冲区设置,从而能够支持高速数据通讯。
USART: 支持同步\异步通信、全双工、串行
UART :没有信号线,只支持异步通信、全双工、串行
USART(Universal Synchronous/Asynchronous Receiver/Transmitter)是一种通用的串行通信接口,广泛应用于微控制器和其他电子设备中。它是一种功能强大且灵活的串行通信接口,可以支持异步和同步通信方式。
USART提供了同时支持异步和同步传输的能力,使其适用于各种通信需求。它可以用于串口通信,如RS-232和RS-485,以及其他串行通信协议,如SPI和I2C。
USART在异步通信中支持可变波特率,并且使用起始位和停止位进行数据帧同步。它还提供了硬件流控制功能,可以进行数据流的控制和调节。
在同步通信中,USART支持通过外部时钟信号来同步数据传输。它可以与外部设备同步传输数据,例如通过SPI总线进行高速数据交换。
USART的功能通常包括数据缓冲区、发送和接收寄存器、波特率发生器和控制寄存器等。通过编程配置这些寄存器,可以实现对USART的各种参数和功能的控制。
USART广泛应用于嵌入式系统、通信设备、传感器和其他需要串行通信的应用中。它提供了一种灵活可靠的通信接口,使设备能够与其他设备进行数据交换和通信。
3. 串口通信协议
串口通信协议是用于在计算机和外部设备之间进行数据传输的一种通信协议。在串口通信中,数据以串行方式逐位传输,与并行通信相对。
串口通信协议涉及以下方面:
-
物理层:串口通信使用一对数据线(发送线和接收线)连接计算机和外部设备。常用的串口类型包括RS-232、RS-422和RS-485等。物理层规定了数据线的电气特性和连接方式。
-
数据帧格式:串口通信将数据划分为一个个数据帧进行传输。一个数据帧通常包括起始位(start bit)、数据位(data bits)、校验位(parity bit)和停止位(stop bit)。数据帧格式的具体定义可能有所不同,根据通信需求和协议规范进行配置。
-
波特率:波特率(Baud rate)定义了每秒钟传输的位数。它表示串口通信的速度。常见的波特率包括9600、19200、38400、115200等。
-
控制流:控制流用于协调发送方和接收方之间的数据传输。常见的控制流方式包括无流控、硬件流控和软件流控。无流控表示没有控制流机制,硬件流控使用额外的线路进行流控信号传输,而软件流控使用特殊的控制字符进行流控。
在串口通信中,发送方将数据按照特定的数据帧格式发送到接收方,接收方解析数据帧并处理数据。
串口通信中的数据帧格式通常由以下几个部分组成:
-
起始位(Start Bit):一个起始位用于指示数据帧的开始。起始位通常为逻辑低电平(0)。
-
数据位(Data Bits):数据位用于传输实际的数据。数据位的数量可以是5、6、7或8位,表示每个数据字节的位数。
-
奇偶校验位(Parity Bit):奇偶校验位用于错误检测。它可以是奇校验(Odd Parity)、偶校验(Even Parity)或不进行校验(No Parity)。奇偶校验位的值由数据位中的位数确定,并使整个数据帧中的1位数(奇数或偶数)保持一致。
-
停止位(Stop Bit):一个或多个停止位用于指示数据帧的结束。停止位通常为逻辑高电平(1)。常见的停止位数量为1位或2位。
下面是一个常见的8位数据位、无奇偶校验、1位停止位的数据帧格式示例:
起始位 | 数据位(8位) | 奇偶校验位 | 停止位(1位) |
---|---|---|---|
0 | 数据字节 | 无 | 1 |
发送方和接收方在进行数据传输时,都必须使用相同的数据帧格式配置。接收方通过检测起始位、读取数据位和校验位,以及验证停止位来解析接收到的数据帧。
需要注意的是,实际应用中的数据帧格式可能有所不同,可以根据具体的通信协议和设备要求进行配置。
4. 相关寄存器
串口控制寄存器
(设备功能初始化、通信帧格式配置)
USART_CR1 USART_CR2 USART_CR3
串口通信中的串口控制寄存器(Serial Control Register)是用于配置和控制串口操作的寄存器。这些寄存器通常存在于串口控制器芯片中,可以通过读取和写入寄存器的值来设置和控制串口的各种参数和功能。
以下是一些常见的串口控制寄存器及其功能:
-
波特率寄存器(Baud Rate Register):用于设置串口的波特率,即数据传输的速率。
-
数据格式寄存器(Data Format Register):用于配置数据位数、奇偶校验和停止位数等数据帧格式参数。
-
接收寄存器(Receive Register):用于存储接收到的数据字节。
-
发送寄存器(Transmit Register):用于存储待发送的数据字节。
-
状态寄存器(Status Register):包含各种状态标志位,用于指示串口的状态,如接收缓冲区是否为空、发送缓冲区是否为空等。
-
控制寄存器(Control Register):用于控制串口的各种操作和功能,如启动发送、启动接收、使能中断等。
-
中断使能寄存器(Interrupt Enable Register):用于配置哪些串口事件会触发中断,并允许或禁止中断的产生。
具体的串口控制寄存器及其功能可能会根据不同的串口控制器芯片而有所差异。在使用串口通信时,需要参考相关芯片的数据手册或文档,以了解具体的寄存器配置和控制方式。
值得注意的是,对串口控制寄存器的读取和写入操作可以使用特定的指令或地址访问方式进行,具体取决于使用的芯片和系统架构。
波特率寄存器
USART_BRR
用于设置串口的波特率,即数据传输的速率。波特率寄存器的值决定了每秒钟传输的位数。
通常,波特率寄存器的值与一个参考时钟频率相关联,通过计算或配置来确定具体的波特率。常见的参考时钟频率包括系统时钟、晶体振荡器的频率等。
具体的配置方式可能因芯片和串口控制器的不同而有所差异。一般而言,将所需的波特率转换为一个可接受的寄存器值,然后将该值写入波特率寄存器即可设置波特率。
例如,对于常见的串口控制器芯片,如UART(通用异步收发器),波特率寄存器通常是一个16位的寄存器,其中的值被用于计算数据位的传输时间。通过选择适当的波特率寄存器值,可以实现不同的波特率配置,如9600、19200、115200等。
在使用串口通信时,应参考芯片或串口控制器的数据手册或文档,以确定波特率寄存器的具体配置方式和可接受的值范围。
中断和状态寄存器
USART_ISR
中断寄存器和状态寄存器是在串口通信中常见的寄存器,用于处理中断和获取串口状态信息。它们在串口通信过程中起到重要的作用。
- 中断寄存器(Interrupt Register):中断寄存器用于标识和控制串口通信过程中发生的中断事件。它包含了多个中断标志位,每个标志位表示一个特定的中断事件。当某个中断事件发生时,相应的中断标志位会被设置为1,以通知系统发生了中断。
常见的中断标志位包括:
-
接收中断标志位(Receive Interrupt):指示接收缓冲区中有新的数据可供读取时触发的中断。
-
发送中断标志位(Transmit Interrupt):指示发送缓冲区已经空闲,可以写入新的数据时触发的中断。
-
错误中断标志位(Error Interrupt):指示在数据传输过程中发生了错误,如校验错误、帧错误等。
通过读取中断寄存器,可以检测到是否发生了特定的中断事件,并相应地处理中断。一般来说,读取中断寄存器的值会清除相应的中断标志位。
- 状态寄存器(Status Register):状态寄存器提供了关于串口的各种状态信息。它包含了多个状态标志位,每个标志位表示串口的一个特定状态。状态寄存器可以被读取,以获取当前串口的状态。
常见的状态标志位包括:
-
接收缓冲区空标志位(Receiver Buffer Empty):指示接收缓冲区是否为空。当该位为1时,表示接收缓冲区中没有可读取的数据。
-
发送缓冲区空标志位(Transmitter Buffer Empty):指示发送缓冲区是否为空。当该位为1时,表示发送缓冲区已经发送完毕,可以写入新的数据。
-
传输错误标志位(Transmission Error):指示在数据传输过程中是否发生了错误,如校验错误、帧错误等。
通过读取状态寄存器,可以了解串口的当前状态,例如接收缓冲区的状态、发送缓冲区的状态以及传输是否出现错误等。
数据发送寄存器
USART_TDR
数据发送寄存器(Transmit Data Register)是用于存储待发送的数据字节的寄存器。在串口通信中,将要发送的数据通过写入数据发送寄存器来传输到串口发送缓冲区,并最终发送到通信线路上。
数据发送寄存器通常是一个与串口控制器相关联的寄存器。通过向数据发送寄存器写入数据,可以触发串口控制器将数据从发送缓冲区发送出去。串口控制器根据发送缓冲区中的数据逐个发送,直到发送完所有数据或发送缓冲区为空。
具体的数据发送寄存器的操作方式和访问方法可能因芯片和串口控制器的不同而有所差异。一般而言,将要发送的数据字节写入数据发送寄存器的特定位或指定的地址即可。
在数据发送过程中,通常需要等待数据发送完成或者检查发送缓冲区的状态来确定是否可以继续写入新的数据。这可以通过读取状态寄存器的相应标志位,如发送缓冲区空标志位(Transmitter Buffer Empty)来实现。
需要注意的是,对于某些串口控制器,数据发送寄存器可能是一个只写寄存器,无法直接读取发送缓冲区的数据。而对于其他控制器,可能提供了读取发送寄存器的方式,以获取当前正在发送的数据字节。
在使用串口通信时,应参考芯片或串口控制器的数据手册或文档,以了解具体的数据发送寄存器配置和使用方式。
数据接收寄存器
USART_RDR
数据接收寄存器(Receive Data Register)是用于存储接收到的数据字节的寄存器。在串口通信中,接收到的数据通过数据接收寄存器存储,并可以从中读取。
数据接收寄存器通常是一个与串口控制器相关联的寄存器。串口控制器将接收到的数据字节存储到接收缓冲区,并将数据从接收缓冲区传输到数据接收寄存器。通过读取数据接收寄存器,可以获取接收到的数据字节。
具体的数据接收寄存器的操作方式和访问方法可能因芯片和串口控制器的不同而有所差异。一般而言,通过读取数据接收寄存器的特定位或指定的地址,可以获取接收到的数据字节。
在数据接收过程中,通常需要检查数据接收寄存器的状态来确定是否有新的数据可供读取。这可以通过读取状态寄存器的相应标志位,如接收缓冲区空标志位(Receiver Buffer Empty)来实现。
需要注意的是,对于某些串口控制器,数据接收寄存器可能是一个只读寄存器,无法直接写入数据。而对于其他控制器,可能提供了写入数据接收寄存器的方式,以模拟接收到的数据。
在使用串口通信时,应参考芯片或串口控制器的数据手册或文档,以了解具体的数据接收寄存器配置和使用方式。
5. USART功能框图
6. 串口发送练习
1. 要求
通过单片机以1s间隔向电脑发送“helloworld”
2. STM32CubeMX配置
3. 代码编写
1.实现字符发送函数 Uart_Putchar()
2.实现字符串发送函数 Uart_Puts()
3.发送字符串“helloworld”
7. 串口收发练习
要求
通过串口助手向单片机发送数据,单片机接收到数据后原样返回。
代码编写
1. 实现字符接收函数 Uart_Getchar()
2.实现字符串接收函数 Uart_Gets()
3.实现收发功能
8. HAL库函数
串口发送函数:
HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)
功能:以阻塞模式通过串口发送数据
参数:UART_HandleTypeDef * huart 设备的句柄
uint8_t * pData 要输出的缓存区首地址
uint16_t Size 发送的数据量
uint32_t Timeout 超时时间
返回值:发送状态
串口接收函数:
HAL_StatusTypeDef HAL_UART_Receive (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout)
功能:以阻塞模式通过串口接收数据
参数:UART_HandleTypeDef * huart 设备的句柄
uint8_t * pData 输入缓存区首地址
uint16_t Size 接收的数据量
uint32_t Timeout 超时时间
返回值:接收状态
使用HAL库函数实现串口收发
9. printf的重定向
int printf(const char * format,…)
printf函数底层调用的是fputc函数,fputs是将要发送的数据写入到标准输出流stdout
int fputc(int /c/, FILE * /stream/)
因此如果想让printf将数据输出到串口,需要重写fputc
添加头文件stdio.h
调用printf