嵌入式学习笔记7.串口通信UART
1.并行通信
并行通信是指将数据字节的各位用多条数据线同时进行传输的通信方式。这种方式的特点是控制简单、传输速度快,但传输线较多,长距离传输时硬件成本较高。
2.串行通信
串行通信是指将数据字节分成一位一位的形式在一条传输线上逐个地传输。串行通信的特点是传输线少,长距离传输时成本低,但数据的传输控制比并行通信复杂。
同步串行和异步串行
按照实现数据同步的不同方式,串行通信又可以分成同步串行和异步串行两类。
(1)同步串行
同步通信的收发双方通过建立专门的时钟信号使双方达到完全同步。产生时钟的一方称为主机(master)接收时钟的一方称为从机(slave)。此类通信的实例包括SPI和I ²C。
同步串行通信的优点是可以实现高速度、大容量的数据传送,缺点是要求发送时钟和接收时钟保持严格的同步,通信协议及硬件电路较为复杂。
(2)异步串行
异步通信的收发双方没有专门的时钟信号,而是依靠事先约定的字符格式和通信速率来完成通信。此类通信的实例包括USB、以太网和异步串口(UART)。
异步串行通信的特点
异步通信是以字符为单位进行传输,字符与字符之间的间隙(时间间隔)是任意的,但每个字符内部的各位是以固定的时间间隔传送的,即每一位在通信线路上持续的时间是相同的。
异步串行通信的一个字符一般由四部分组成:起始位、数据位、奇偶校验位以及停止位。一个字符由起始位开始,停止位结束。传输时低位在前,高位在后。
波特率
在串行通信中还有一个重要的指标叫波特率,它的定义是每秒钟传送二进制数码的位数,以bit/s为单位。
波特率表征了串行通信的速率,常用的波特率有:9600、19200、38400、57600和 115200。波特率为115200表示每秒传输115200位,且每一位数据在通信线路上持续时间为T=1/1152008.68μs。如果字符格式采用1位起始位,8位数据位,1位停止位,无奇偶校验位,则每秒传输的有效数据为11520字节(起始位和停止位不算有效数据,由硬件自动添加)
综上所述,在异步串行通信中,收发双方能够准确传输数据的关键就是要约定两件事:字符格式和波特率。前者决定了字符中数据的传输形式,后者决定了每一位数据在通信线路上持续的时间。
串行通信的传输方向
按照数据传输的方向,串行通信还可以分成以下三类:
(1)单工
单工是指数据传输仅能沿一个方向,不能实现反向传输,只有一条通信线路。
(2)半双工
半双工是指数据传输可以沿两个方向,但需要分时进行,也只有一条通信线路
(3)全双工
全双工是指数据可以同时进行接收和发送,一般有两条通信线路。我们本章介绍的 UART就属于全双工方式。
串行通信的错误校验
(1)奇偶校验
在发送数据时,数据位之后的1位称为奇偶校验位。
奇校验时,数据中“1”的个数与校验位“1”的个数之和应为奇数。
偶校验时,数据中“1”的个数与校验位“1”的个数之和应为偶数。
接收字符时,对“1”的个数进行校验,若发现不一致,则说明传输数据过程中出现了差错。奇偶检验只能检验出单个位数出现错误的情况。
例如,数据位为8位,传输内容为00110101,数据中有4个1。如果采用奇校验,则校验位应为1,以保证数据位和校验位中“1”的个数之和为奇数。如果采用偶校验,则校验位应为0,以保证数据位和校验位中“1”的个数之和为偶数。校验位的产生一般由硬件自动完成,用户只需要使能相应的控制位即可。
(2)代码和校验
(3)循环余校验
通信状态标志位
TXE
发送数据寄存器空标志。当发送数据寄存器TDR的内容已经转移到发送移位寄存器时,该位由硬件置1。如果串口控制寄存器CR1中的TXEIE位为1.将会触发发送数据寄存器空中断(TXE中断)。
注意:当TXE为1时,数据有可能还在发送。
TC
发送完成标志。当发送移位寄存器的内容发送完成,同时发送数据寄存器TDR也为空时,该位由硬件置1,表示本次数据传输已经完成。如果串口控制寄存器CR1中的
TCIE位为1,将会触发发送完成中断(TC中断)注意:当TC置1时,数据已经完成发送
RXNE
接收数据寄存器不为空标志。当移位寄存器的内容已转移到接收数据寄存器RDR 时,该位由硬件置1。如果串口控制寄存器CR1中的RXNEIE位为1,将会触发接收数据寄存器不为空中断(RXNE中断)。
采用轮询方式进行串口发送时:
用户可以检测TXE和TC两个标志位来判断发送状态。在数据发送过程中,通过判断TXE标志位来判断发送数据寄存器TDR是否为空,为空表示数据已经从TDR转移到发送移位寄存器,用户可以写人新的数据,否则就等待。而数据是否发送完成则必须判断TC标志位,以确保最后一个数据发送完成。
如果用户只是通过判断TXE标志位来决定结束本次发送,则有可能导致以下情况出现:最后一个数据还在发送移位寄存器里发送,而用户就提前结束了发送状态,导致最后一个数据无法正确发送。
采用轮询方式进行串口接收时,用户可以检测RXNE标志位来判断是否接收到了新的数据,有则读取,没有则等待。
在中断方式下:
如果串口控制寄存器CR1中TXEIE位为1,则会触发发送寄存器空中断(TXE中断);TCIE位为1,则会触发发送完成中断(TC中断);RXNEIE位为1,则会触发接收数据寄存器不为空中断(RXNE中断)。用户在串口中断服务程序中通过检测不同的标志位,来判断中断类型,然后进行后续的中断处理任务:如果是TXE为1,则表示 CPU可以写入新的数据;如果是TC为1,则表示本次数据发送完成;如果是RXNE为1,则表示CPU可以读取新的数据。
这里以轮询的条件下完成固定长度的数据收发为例:
STM32CubeMx配置
Keil代码
要用到的函数定义:
接收函数
传输函数
usart.c文件里
串口初始化
主函数里
proteus仿真
在仿真之前我们需要安装虚拟串口和串口助手,这里我把资源上传了,需要需要自取
虚拟串口

电路搭建
双击COMPIM
双击虚拟终端
打开串口助手

到这里配置就完成了
实验现象
固定长度串口收发数据






















浙公网安备 33010602011771号