通信协议介绍
并行通信和串口通信
- 并行通信的各个位同时传输,每一位数据都需要一条传输线。优点是传输快,适合短距离传输,但是成本高
- 串行通信将数据分成位的形式,在一条传输线上逐个传输
单工、半双工和全双工数据传输
- 单工数据传输
只有一方能接受或发送信息,不能实现反向传输 - 半双工数据传输
是一种可以切换方向的单工通信,在同一时间只可以有一方接收或发送信息 - 全双工数据传输
允许数据同时在两个方向上传输
串口通信协议介绍
UART物理层
UART是异步串行全双工通信协议,没有时钟协议
UART数据帧格式
- 起始位
逻辑电平为低电平 - 数据位
- 校验位
- 停止位
- 空闲位
UART传输速率
在需要保证稳定传输的场合,通常采用较低的波特率
UART通信实例
UART电路原理图
串口中断
串口中断请求标志位
串口中断允许控制位
串口中断允许控制位决定CPU能否响应中断
串口中断优先级控制位
注意:IPH寄存器不可以进行位寻址操作
串口工作模式
工作模式0
工作模式1
工作模式2
工作模式3
实例与代码解析
- 包含头文件
#include <reg52.h>
- 编写串口配置函数
static void InitUART()
{
SCON = 0x50; // 设置串口为工作模式1,并打开接受允许
TMOD= 0x20; // 设置定时器1为工作模式2(8位自动重装载定时器)
PCON = 0x80; // 设置波特率加倍
TL1 = 0xF3; // 设置定时器1计数初值,波特率为4800
TH1 = TL1; // 设置定时器1重装载值,等于计数初值
TR1 = 1; // 打开定时器1
}
- 编写中断配置函数
static void InitInterrupt()
{
ES = 1; // 打开串口接收中断允许
EA = 1; // 打开总中断允许
}
- 编写主函数
void main()
{
InitInterrupt(); // 初始化中断
InitUART(); // 初始化串口
while (1)
{
}
}
- 编写中断服务函数
void UART_Handler() interrupt 4
{
static unsigned char s_iBuffer; // 定义缓冲变量
s_iBuffer = SBUF; // 将数据从寄存器中取出
RI = 0; // 清除接收中断标志位
SBUF = s_iBuffer; // 将数据放入寄存器
while (!TI) // 等待数据发送完成
{
}
TI = 0; // 清除发送中断请求标志位
}