通信,最少要有两个对象,一个收,一个发。
同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信。
异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布。
串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。
并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行
单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机
半双工:可以收,可以发,但是不能同时收发, 比如对讲机
通信标准 |
引脚说明 |
通信方式 |
通信方向 |
UART (通用异步收发器) |
TXD:发送端 RXD:接受端 GND:公共地 |
异步通信 |
全双工 |
单总线 (1-wire) |
DQ:发送/接受端 |
异步通信 |
半双工 |
SPI |
SCK:同步时钟 MISO:主机输入,从机输出 MOSI:主机输出,从机输入 |
同步通信 |
全双工 |
I2C |
SCL:同步时钟 SDA:数据输入/输出端 |
同步通信 |
半双工 |
通用同步异步收发器(USART)灵活地与外部设备进行全双工数据通信,满足外部设备对工业标准NRZ异步串行数据格式的要求。USART通过小数波特率发生器提供了多种波特率。它支持同步单向通信和半双工单线通信;还支持LIN(局域互联网络),智能卡协议与IrDA(红外数据协会)SIR ENDEC规范,以及调制解调操作(CTS/RTS)。而且,它还支持多处理器通信。
USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此USART和一般单片机UART使用方式是一样的,都使用异步模式。
注:一般以TX,RX结尾的接口为串口
STM32F051内置多达两个通用同步 / 异步收发器( USART1 和 USART2 ),通信速度可达 6 Mbit / s
1、初始化串口:配置串口的波特率、数据位、停止位和校验位等参数。
2、配置GPIO引脚:选择合适的GPIO引脚作为串口的TX(发送)和RX(接收)引脚。
3、发送数据:使用适当的函数将数据发送到串口缓冲区。
4、接收数据:通过轮询或中断方式从串口缓冲区读取接收到的数据。
波特率:
在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。
国际上规定一个标准的波特率系列: 110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……
例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信
注意:实际的数据没这么多,还包括起始位,结束位,校验位
奇偶校验:
奇偶校验有两种类型:奇校验和偶校验。
在奇校验中,校验位被设置为确保数据中1的个数为奇数;
而在偶校验中,校验位被设置为确保数据中1的个数为偶数;
控制寄存器 —— USART_CR
状态寄存器 —— USART_SR
数据寄存器 —— USART_DR
波特率寄存器 —— USART_BRR
寄存器具体位功能参考STM32F051中文手册
地址偏移:0x00; 复位值:0x0000
功能:可以用来配置中断,通信协议中的数据位,校验位。
中断使能:就是指,让中断可以被触发,可以进入中断服务程序。
中断禁止:即使中断信号来了也不会触发中断 也就不会进入中断服务程序。
地址偏移:0x04; 复位值:0x0000
功能:用来配置串口协议的停止位。
一般情况下串口协议才用8 N 1 的配置,8个数据位,N就是没有奇偶校验,1表示一个停止位。
这个寄存器只能在USART未被使能的时候(UE = 0)改写。在自动波特率检测模式下,可能会被硬件自动改写。
地址偏移:0x0c; 复位值:0x0000
功能:用于配置串口协议通信速率。
地址偏移:0x1c ; 复位值:0x0000
功能:中断状态寄存器的各个位用来描述串口通信协议通信过程中的串口的状态,例如数据发送已完成,数据接收已完成等。
较为重要的是 位5 RXNE:接收数据寄存器非空 和 位 7 TEX:发送数据寄存器空
默认情况下,printf函数会将字符输出到标准输出流stdout,而stdout的默认输出设备是终端。但是,通过重写fputc函数,我们可以修改printf函数的行为,使其将字符逐个发送到串口,从而实现通过串口进行通信。
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}