串口通信UART协议

发布时间 2023-05-26 16:40:55作者: JaydenHuan

前言

在这个广泛应用和计算机网络技术普及的时代,单片机的通信功能愈发重要。在WIFI、蓝牙、GPS、GSM/GPRS等应用的控制无不体现串口通信的重要性。

通信基本概念

  • 数据传送方式:串行通信和并行通信;并行就是多根线,串行就是单根线。
  • 数据同步方式:异步通信和同步通信;异步是不带时钟频率的,同步是带时钟频率的。
  • 数据传输方向:单工、半双工、全双工通信;单工,就是单向通信,不能逆向,半双工就是相当于对讲机,两个通信口复用同一根线,全双工就相当于打电话,可以有两根线,互相通信。
  • 比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)。如 每秒钟传送 240 个字符,而每个字符格式包含 10 位(1 个起始位、1 个停止位、 8 个数据位),这时的比特率为: 10 位×240 个/秒 = 2400 bp
  • 它表示每秒钟传输了多少个码元。而 码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制 数字,这样的信号称为码元。

串口通信基础

串口通信(Serial Communication),是指外设和计算机间通过数据信号线、 地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口 标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。

串口标准

串口通信的接口标准有很多,有 RS-232C、 RS-232、 RS-422A、 RS-485 等。 常用的是 RS-232 和 RS-485。RS-232 其实是 RS-232C 的改进,原理是一样的。 这里我们就以 RS-232C 接口进行讲解。 RS-232C 是 EIA(美国电子工业协会)1969 年修订 RS-232C 标准。RS-232C 定义了数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准

通信协议

RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。 “96”表示的是通信波特率为 9600。串口通信中通常使用的是异步串口通 信,即没有时钟线,所以两个设备要通信,必须要保持一致的波特率,当然,波特率常用值还有 4800、 115200 等。 “N”表示的是无校验位,由于串口通信相对更容易受到外部干扰导致传输 数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。 具体的介绍,大家可以百度串口通信了解。 “8”表示的是数据位数为 8 位,其数据格式在前面介绍异步通信中已讲过。 当然数据位数还可以为 5、6、7 位长度。 “1”表示的是 1 位停止位,串口通讯的一个数据包从起始信号开始,直到 停止信号结束。数据包的起始信号由一个逻辑 0 的数据位表示,而数据包的停 止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即 可。

串口内部结构图

img
上图中右边的 TXD 和 RXD 为单片机 IO 口,TXD 对应的是 P3.1 管脚,RXD 对 应的是 P3.0 管脚。

串口寄存器

串行口控制寄存器SCON

串口控制寄存器SCON,SM0和SM1为工作方式选择位:
img

img

SM2:多机通信控制位,主要用于方式 2 和方式 3。当 SM2=1 时可以利用收到 的 RB8 来控制是否激活 RI(RB8=0 时不激活 RI,收到的信息丢弃;RB8=1 时收 到的数据进入 SBUF,并激活 RI,进而在中断服务中将数据从 SBUF 读走)。当 SM2=0 时,不论收到的 RB8 为 0 和 1,均可以使收到的数据进入 SBUF,并激活 RI (即此时 RB8 不具有控制 RI 激活的功能)。通过控制 SM2,可以实现多机通信。 REN:允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置 REN=0,则禁止接收。 TB8:在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。 可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。 在方式 0 和方式 1 中,该位未用到。 RB8:在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地 址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。 TI:发送中断标志位。在方式 0 时,当串行发送第 8 位数据结束时,或在其 它方式,串行发送停止位的开始时,由内部硬件使 TI 置 1,向 CPU 发中断申请。 在中断服务程序中,必须用软件将其清 0,取消此中断申请。 RI:接收中断标志位。在方式 0 时,当串行接收第 8 位数据结束时,或在其 它方式,串行接收停止位的中间时,由内部硬件使 RI 置 1,向 CPU 发中断申请。 也必须在中断服务程序中,用软件将其清 0,取消此中断申请。

电源控制寄存器PCON

img

SMOD:波特率倍增位。在串口方式 1、方式 2、方式 3 时,波特率与 SMOD 有 关,当 SMOD=1 时,波特率提高一倍。复位时,SMOD=0。

SBUF

SBUF是发送缓冲器,就只能写入而不能读出,接收缓冲器只能读出而不能写入,因此这个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器。

实验代码部分

实验现象,PC端发送信息到单片机,还可以通过中断系统来控制LED灯的亮灭。

主函数部分


/*******************************************************************************
* 函 数 名 : main.c
* 函数功能 : 串口通信中断配置函数,通过设置 TH 和 TL 即可确定定时时间
* 输 入 : baud:波特率对应的 TH、TL 装载值
* 输 出 : 无
*******************************************************************************/
#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"

unsigned char Sec;


void main()
{
	
	Uart_init();
	
	
	while(1)
	{
		
	}
}

void Uart() interrupt 4 //串口通信中断函数
{ 
	if(RI==1)
	{
		P2=~SBUF;
		Uart_SendByte(SBUF);
		RI=0;
	}
	
}

Uart协议部分函数

/*******************************************************************************
* 函 数 名 : uart_init
* 函数功能 : 串口通信中UART协议
* 输 入 : baud:波特率对应的 TH、TL 装载值
* 输 出 : 无
*******************************************************************************/


#include <REGX52.H>



void Uart_init()		//4800bps@12.000MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF3;		//设定定时初值
	TH1 = 0xF3;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;//打开定时器
	EA = 1;
	ES = 1;
}


// 串口终端函数模板
//void Uart() interrupt 4 //串口通信中断函数
//{ 
//	if(RI==1)
//	{
//		
//		RI=0;
//	}
//	
//}



void Uart_SendByte(unsigned char Byte)
{
	SBUF = Byte;
	while(TI==0);
	TI=0;
}

延时函数代码

/*******************************************************************************
* 函 数 名 :延时函数
* 函数功能 : 延长时间
* 输 入 : xms
* 输 出 : 无
*******************************************************************************/


#include <REGX52.H>


void Delay(unsigned int xms)		
{
	unsigned char i, j;
  while(xms){
	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
}
	}

收获

了解了怎么设定UART工作模式的选择,以及在编写软件过程中,熟悉编程过程中的模块化编程思想。