文章目录
前言
本篇文章开始带大家学习如何使用proteus和STM32Cubemx来完成STM32的学习,第四节课我们来学习串口通信。
proteus使用8.9版本。
STM32Cubemx使用6.3版本。
一、串口通信概念讲解
串口通信概念
串口通信(Serial Communication)是一种数据传输方式,它通过一根数据线按位(bit)顺序发送数据。这种方式通常用于长距离数据传输以及需要简单硬件连接的场合。常见的串口通信接口有RS-232、RS-485、USB等。
串行通信和并行通信
串行通信(Serial Communication):数据按位(bit)顺序通过一条或几条数据线传输,传输速度较慢,但电缆长度可以较长,适合远距离传输。
并行通信(Parallel Communication):数据同时通过多条数据线传输(通常为8位或16位),传输速度较快,但电缆长度有限,适合短距离传输,如计算机内部总线。
(此图片参考https://new.juyingele.com/news/2704.html)
波特率
波特率(Baud Rate)是指每秒钟传输的符号(或波特)数量。在串行通信中,通常一个符号代表一个比特(bit)。常见的波特率有9600、19200、38400、57600、115200等。波特率越高,数据传输速度越快,但对传输介质的要求也越高。
串口数据帧格式
在串口通信中,数据是以帧的形式发送的。一个典型的数据帧包括以下几个部分:
起始位(Start Bit):用于通知接收端数据传输的开始,通常为1位。
数据位(Data Bits):实际的数据内容,通常为5位到8位。
校验位(Parity Bit):用于错误检测,可以有无校验、奇校验或偶校验。
停止位(Stop Bits):用于标识一帧数据的结束,通常为1位或2位。
示例:8N1格式
8:表示8个数据位。
N:表示无校验位(None)。
1:表示1个停止位。
同步通信和异步通信
在串口通信中,数据传输的时间控制方式主要分为同步通信(Synchronous Communication)和异步通信(Asynchronous Communication)。这两种方式在数据传输的时间协调上有所不同。
同步通信(Synchronous Communication)
概念:
同步通信是指发送端和接收端在同一个时钟信号(Clock Signal)的控制下进行数据传输。时钟信号确保数据传输的时序一致,发送端和接收端同时按照时钟的节奏发送和接收数据。
特点:
- 时钟信号:需要额外的一条线传输时钟信号,保证发送和接收同步。
- 高速传输:由于有时钟信号同步,可以实现高速数据传输。
- 复杂性:硬件和协议实现较为复杂,需要发送和接收双方保持时钟同步。
应用:
- SPI(Serial Peripheral Interface)
- I2C(Inter-Integrated Circuit)
- CAN(Controller Area Network)
示例:
在SPI通信中,主设备(Master)生成时钟信号,所有从设备(Slave)都以这个时钟信号为基准进行数据传输。
异步通信(Asynchronous Communication)
概念:
异步通信不使用共享的时钟信号,而是通过起始位(Start Bit)和停止位(Stop Bit)来标识数据帧的开始和结束。数据传输的时间间隔可以不一致,接收端通过起始位和停止位来确定每个数据帧的位置。
特点:
- 无需时钟信号:不需要额外的时钟线,降低了硬件复杂度。
- 灵活性高:数据可以在任意时间发送和接收,适合不定期数据传输。
- 较低速率:由于需要增加起始位和停止位,数据传输速率相对较低。
应用:
- RS-232串口通信
- UART(Universal Asynchronous Receiver/Transmitter)
示例:
在UART通信中,每个数据帧由一个起始位、5到8个数据位、一个可选的校验位和一个或两个停止位组成。接收端通过检测起始位来同步,并在停止位时重新准备接收下一帧数据。
对比总结
特性 | 同步通信(Synchronous Communication) | 异步通信(Asynchronous Communication) |
---|---|---|
时钟信号 | 需要外部时钟信号 | 无需外部时钟信号 |
数据传输速率 | 高速 | 较低 |
硬件复杂度 | 较高 | 较低 |
适用场景 | 连续、高速数据传输 | 不定期、低速数据传输 |
常见协议 | SPI、I2C | UART、RS-232 |
实际应用
- 同步通信:适用于需要高数据传输速率和精确时序控制的场合,如嵌入式系统中传感器数据采集、存储设备通信等。
- 异步通信:适用于不定期数据传输且对时序要求不高的场合,如计算机与外设的通信、远距离低速数据传输等。
通过了解同步通信和异步通信的基本原理和区别,可以在实际应用中选择合适的通信方式,确保系统的可靠性和效率。
串口通信连接方式
串口通信的连接方式主要涉及四个重要的引脚:接收数据(RX)、发送数据(TX)、地(GND)和电源(VCC)。正确连接这些引脚可以确保设备之间的数据传输顺畅和可靠。
连接方式:
- 设备A的VCC连接设备B的VCC(如果需要)
典型连接示例
假设我们有两个设备:设备A和设备B。它们的串口引脚连接如下:
设备A 引脚 | 连接方式 | 设备B 引脚 |
---|---|---|
TX | --------> | RX |
RX | <-------- | TX |
GND | --------> | GND |
VCC | --------> | VCC |
图示
设备A 设备B
+---------+ +---------+
| | | |
| TX -|-------------->|- RX |
| | | |
| RX -|<--------------|- TX |
| | | |
| GND -|-------------->|- GND |
| | | |
| VCC -|-------------->|- VCC |
+---------+ +---------+
二、STM32Cubemx创建工程
这里我们选择使用串口1来完成这次的实验。
PA10作为串口接收数据的引脚。
PA9作为串口发送数据的引脚。
三、proteus仿真电路图
首先找到串口:
连接串口线:
这里需要注意的就是RXD是连接到单片机上面的RXD,TXD是连接到单片机上面的TXD,大家不要连接反了。
找到虚拟终端:
这里的连线就是RXD - TXD,TXD-RXD。
整体仿真图:
四、代码编写
下面先给大家讲解一下串口的发送函数:
HAL_UART_Transmit
函数是STM32 HAL库(硬件抽象层库)中用于通过UART(通用异步收发传输器)接口发送数据的函数。STM32 HAL库为开发者提供了一个高层次的接口,以简化STM32微控制器外设的操作。HAL_UART_Transmit
函数可以在非阻塞或阻塞模式下工作,具体取决于传输完成前是否需要等待。
函数定义和原型
HAL_UART_Transmit
函数的原型通常如下所示:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
参数说明
UART_HandleTypeDef *huart
: 指向UART句柄的指针。该句柄包含了UART外设的配置信息和状态信息,通常在初始化UART外设时设置。uint8_t *pData
: 指向要发送的数据缓冲区的指针。uint16_t Size
: 要发送的数据字节数。uint32_t Timeout
: 发送操作的超时时间(以毫秒为单位)。如果在指定时间内没有完成发送操作,函数将返回超时错误。
返回值
该函数返回一个HAL_StatusTypeDef
类型的值,表示函数的执行结果。可能的返回值包括:
HAL_OK
:操作成功。HAL_ERROR
:操作失败。HAL_BUSY
:UART正在进行其他操作。HAL_TIMEOUT
:操作超时。
示例代码
以下是一个使用HAL_UART_Transmit
函数发送数据的示例代码:
int main(void)
{
while (1)
{
HAL_UART_Transmit(&huart1, "Hello World\r\n", sizeof("Hello World\r\n") - 1, 1000);
HAL_Delay(1000); // 延时1秒
}
}
运行效果:
总结
本篇文章就讲解到这里,大家有什么疑问都可以留言。
本篇文章代码和工程将放在微信公众号中。
回复 STM32仿真串口
即可领取源码和工程。