1.串口基本概念
1.1 串口通讯(Serial Communication)
是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
1.2 串口通讯的数据格式
起始位(低电平),数据位,停止位(高电平),奇校验,偶校验
停止位 不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
1.3 通讯方式
- 全双工模式(Full Duplex)、
- 单工模式(Simplex Communication)、
- 半双工模式(Half Duplex 485、232)
EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。 EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。
1.4 串口物理链路形式
- TTL用于两个MCU之间,全双工(逻辑电平1:2.4V–5V 逻辑电平0:0V–0.5V )
- RS-232用于MCU与PC机之间,全双工(逻辑电平1:-15V–+5V 逻辑电平0:+3V–+15V )串行通信中,线路空闲时,线路的 TTL 电平总是高,经反向 RS232 的电平总是低。一个数据的开始 RS232 线路为高电平,结束时 Rs232 为低电平。
- 485和422,RS485是半双工的,RS422是全双工的。数据稳定但是增加通信功耗,差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了,422共模电压范围为-7~+7V,而RS-485收发器共模电压范围为-7~+12V。有更高的抗干扰能力,传输距离可以达到上千米。
1.5 同步通信和异步通信
- 同步通信,通信双方必须先建立同步,即双方的时钟要调整到同一个频率。收发双方不停地发送和接收连续的同步比特流。但这时还有两种不同的同步方式。一种是使用全网同步,用一个非常精确的主时钟对全网所有结点上的时钟进行同步。另一种是使用准同步,各结点的时钟之间允许有微小的误差,然后采用其他措施实现同步传输。(对发送器和接收器要求成本较高,传输效率高)
- 异步通信,异步串行通信是指发送端和接受端在相同的波特率下不需要严格地同步,允许有相对的时间时延,即收、发两端的频率偏差在10%以内,就能保证正确实现通信。异步通信在不发送数据时,数据信号线上总是呈现高电平状态,称为空闲状态。(实现容易广泛应用,通讯速率较低)
- 两者区别
同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。 同步通信效率高,异步通信效率较低。 同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。 同步通信可用于点对多点,异步通信只适用于点对点。
2.STM32 串口配置
2.1 USART句柄
串口初始化结构体
- 配置串口参数:波特率、字长、停止位、校验位、模式(发送模式、接收模式、收发模式)、硬件流控模式
- USART_RTS、USART_CTS,大部分都没怎么使用过,
RTS → Request To Send 请求发送。是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。(Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。 CTS ← Clear To Send 允许发送。是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低。用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。 - OverSampling 过采样,对串口数据采样,一般使用
16倍波特率时钟进行采样 ,接收器的设计最主要的一点是如何提高采样的准确率,最好是保证采样点处于被采样数据的时间中间点。所以,在接收采样时要用比数据波特率高n倍(n≥1)速率的时钟对数据进行采样。 - OneBitSampling 指定是选择单个样本还是选择三个样本的多数投票。选择单采样方法增加了接收机对时钟的容忍度偏差。
串口相关寄存器
- RDR、TDR 数据收发寄存器
- ISR、ICR 中断标志寄存器和中断清除寄存器
- CR1、CR2、CR3 控制寄存器
- GTPR 保护时间和预调度器寄存器
- RTOR 接收超时寄存器
- RESERVED1、RESERVED2 定义保留字
- BRR 波特率寄存器
3.串口发送
3.1 发送方式
-
普通发送 HAL_UART_Transmit ?是HAL库提供的串口发送函数。在HAL库的手册中,或者在代码中跳转到函数可以找到函数的说明信息。这个发送函数是阻塞式的 。参数Timeout是超时时间,代表某次执行函数,最多占用串口的时间,单位是毫秒。简单来说,在本次数据发送完之前,不能发送别的数据。所以,调用函数的时候要指明参数,本次发送占用多长时间,在此期间,由于串口资源被独占,不能成功调用发送函数。如果在规定的时间内,数据发送完毕,那就释放占用的串口资源;如果到了时间,即便数据还没有发送完毕,(比如数据量很大),仍需要归还串口资源的控制权,让别人来用。 -
中断发送 HAL_UART_Transmit_IT 相比普通发送,发送最好也用中断,特别是批量数据发送不会造成阻塞,数据帧不大可以用阻塞发送,用中断效率高。 -
DMA发送 HAL_UART_Transmit_DMA -
中止发送 HAL_UART_AbortTransmit 此过程可用于中止在中断或DMA模式下启动的任何正在进行的传输。禁用UART中断(Tx和Rx)、-禁用外围寄存器中的DMA传输(如果启用)、通过调用HAL_DMA_Abort中止DMA传输(在DMA模式下传输的情况下)
*-将句柄状态设置为就绪
3.2 重定向发送
3.3 STM32日志信息
4.串口接收
5.接收一帧数据
6.串口进阶应用
|