1、通信的关键

(1)事先约定。通信之前规定好的,如通信速率,起始信号,结束信号等。

(2)通信传输的基本信息单元。

(3)信息的编码、传输、解码。

2、通信相关的概念

2.1、同步和异步

(1)同步通信要求接收端时钟频率与发送端时钟频率一致,发送端发送连续比特流;

(2)异步通信时,接收端时钟和发送端时钟不需要同步。发送端发送一个字节后,下一个字节可以在任何长时间内发送。

2.2、单工、半双工、全双工

(1)单工即数据传输只在一个方向上传输,方向是固定的,不能实现双向通信。

(2)半双工传输方向可以切换,允许数据在两个方向上传输。但是某个时刻,只允许数据在一个方向上传输,可以基本双向通信。像RS485属于半双工通讯。

(3)全双工允许数据同时在两个方向传输,发送和接收完全独立,在发送的同时可以接收信号,或者在接收的同时可以发送。它要求发送和接收设备都要有独立的发送和接收能力。

比如RS232、RS422就属于全双工通讯。

2.3、并行和串行

(1)并行通信:同一时刻,可以传输多个bit位的信号,有多少个信号位就需要多少根信号线。

(2)串行通讯:同一时刻,只能传输一个bit位的信号,只需要一根信号线。

2.4、电平信号和差分信号

(1)电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。

(2)差分信号的传输线中没有参考电平线,所有都是信号线,然后1和0的表达靠信号线之间的电压差。

(3)电平信号的2根通信线之间的电平差异容易受到干扰,传输容易失败;差分信号不容易受到干扰,因此传输质量比较稳定。现代通信一般都使用差分信号,电平信号几乎没有了。

3、串口通信

3.1、串口通信基础

(1)一种特定的通信协议

(2)别名:串行通信、串口通信、UART、USART。

(3)特点:异步、串行、全双工。

3.2、串口通信主要用途

(1)早期:计算机之间的短距离通信(15米内),早期是一种完备的通信机制。

(2)现在:CPU之间的近距离通信、调试信息的输出,单片机串口与外围元件之间的通信。单片机上的串口一般是非完备通信机制。

3.3、串口通信的工作方式

(1)一般是四根线,VCC、GND、RxD(接收线)、TxD(发送线)。receive接收、transmit发送。

(2)发送方有发送移位寄存器,接收方有接收移位寄存器。

(3)数据在发送方和接收方的CPU中都以字节为单位整字节处理。

(4)数据在通信线上以位(bit)为单位传输。

3.4、串行通信的主要概念

(1)数据帧:用于表示一段完整的数据信息。串口中一帧数据包括:起始位、数据位、校验位、停止位。

(2)波特率:指一个单位时间内传输符号的个数。发送方和接收方必须波特率设置为一样。

4、串口发送接收的软硬件协作方式

(1)查询方式。例如发送:

        硬件在发送完一帧数据后会将一个标志位置位(标志位本来是0),软件需要不断读取这个标志位的值来判断硬件是否完成了发送,如果读出来是0就表示硬件没有完成发送,所以我们就不能认为硬件发完了,所以就不能给硬件安排下一帧数据的发送;如果读出来的是1则说明硬件已经发完了上一帧数据,这时候软件就应该给硬件再给一帧数据去发送。   

(2)中断方式。

        查询方式处理的劣势是CPU必须一直守着串口发送,在串口发送完所有字节之前CPU不能离开去做别的事情,这对CPU来说是极大的浪费(因此CPU的速度比串口发送的速度快多了)。因此用中断方式来处理串口发送接收是非常合适的,可以提升CPU使用率。    

(3)一般情况下,发送采用查询方式,接收采用中断方式。

发送查询:虽然采用中断可以提高效率,但比较麻烦。

中断接收:因为不知道发送端会什么时候发送数据,因此只能采用中断接收。

5、串行通信相关的寄存器

详情参考数据手册,采用单片机为STC89C516。

(1)SCON,串行口控制寄存器。

(2)SBUF,串行口数据缓冲寄存器。

(3)PCON,电源控制寄存器。

(4)IE,中断允许寄存器。

(5)IPH,中断优先级控制寄存器高

(6)IP,中断优先级控制寄存器。

(7)SADER,从机地址掩模寄存器。

(8)SADDR,从机地址寄存器。

6、串口通信硬件接线

6.1、接线分析

(1)将电脑与51单片机通过串口线连接起来。

(2)现在的电脑上一般没有串口,所以电脑需要安装USB转串口驱动。

常见的USB转串口驱动:CH340、CP210x。

(3)51单片机使用TTL电平。

6.2、接线方法

(1)使用TTL接口的USB转串口线:USB端接电脑,另一端接单片机的TxD、RxD、GND。

(2)使用板载CH340:单片机程序下载USB口与电脑USB口相连。

7、串口调试软件简介

(1)RTS、DTR为流控相关,现在已经用不到,不用勾选。

(2)数据位(Data bits)一般选择8位,停止位(Stop bits)选择1位,奇偶校验(Parity)无,流控制(Flow control)无。

(3)一个串口号只能被一个串口软件打开。

8、示例代码

(1)单片机为STC89C516.

(2)代码可参考STC-ISP软件。

(3)代码

#include <reg52.h>
#include <intrins.h>


/*函数声明*/
void Delay500ms();                   		 //@12.000MH
void UartInit(void);                     //串口初始化函数
void UartSendByte(unsigned char Dat);    //通过串口发送一个字节数据     
void UartSendString(unsigned char *str); //通过串口发送字符串


void main(void)
{
	UartInit();		                        //串口初始化
	while(1)
	{
		//UartSendByte('D');
		UartSendString("Hello World\r\n");   //编译器会自动在字符串末尾添加'\0',英文是ASCALL码,一个字符8bit
		//UartSendString("知行统一\r\n");     //发送中文和串口无关,编译器会转换成相应编码,一个中文16bit
		//Delay500ms();
	}
}


void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}


/*
 *功能:串口初始化函数,8数据位,1停止位,无校验位,波特率4800
 *参数:无
 *返回值:无
 */
void UartInit(void)
{
	SCON = 0x50;  //串口工作在模式1,8位数据位,允许串行接收
	PCON = 0x80;  //波特率加倍
	TMOD = 0x20;  //设置T1为模式2 
	TH1 = 243;    //波特率4800	,TH1 = 晶振频率/12/32/波特率
	TL1 = 243;    //8位自动重装,意识是TH1用完了之后下一个周期TL1会自动重装到TH1去。
	TR1 = 1;      //开启定时器1
	ES = 1;       //打开串口中断
	EA = 1;       //打开总中断
}


/*
 *功能:通过串口发送一个字节数据
 *参数:需要发送的内容
 *返回值:无
 */
void UartSendByte(unsigned char Dat)
{
	SBUF = Dat;      //准备好需要发送的一个字节
	while(TI == 0);  //确认串口发送没有再忙,while循环需要加超时判断
	TI = 0;			 //软件复位TI标志位
}


/*
 *功能:通过串口发送字符串
 *参数:待发送的字符串
 *返回值:无
 */
void UartSendString(unsigned char *str)
{
	while(*str != '\0')      //等待字符串发完*/
	{
		UartSendByte(*str);  //发送一个字符
		str++;               //指针指向下一个字符
	}
}


/*
 *功能:串口中断接收函数
 *参数:无
 *返回值:无
 *注意:中断函数通过中断编号识别,中断编号可通过查数据手册得到
 */
void Uart_Isr() interrupt 4 
{
	unsigned char ReceiveBit;
	if(RI == 1)
	{
		ReceiveBit = SBUF;		      //读取SBUF,读取串口接收到的一个字节
		RI = 0;
	}
	UartSendByte(ReceiveBit);		  //接收到的内容原封不动发回去
}

9、UART、RS232、RS485、RS422

(1)UART的缺点:传输举例受限。

(2)单片机UART采用TTL电平。

(3)波特率越高通信举例越短。

9.1、远距离传输怎么办?

(1)提高电压标准。(距离越长,电压在通信线上衰减越多)

(2)提高通信线抗干扰能力、降低阻抗。

(3)使用差分信号。

9.2、RS232

(1)RS232理论上传输距离限于15米。

(2)常用的串行通信标准之一。

(3)采用负逻辑传送,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。选用该电气标准的目的在于提高抗干扰能力,增大通信距离。

9.3、RS485

(1)最大通信距离1200米,最快通信速率10Mbps,距离和速度成反比。

(2)采用负逻辑传送。

(3)更远距离可以加中继器。

(4)RS485采用半双工工作方式。

(5)RS485只提供物理层通信能力,不提供数据层协议,需要用户自定义,或者使用标准协议如MODBUS协议。

(6)RS485采用差分信号。

9.4、RS422

(1)差分信号传输。

(2)全双工。

9.5、单片机UART与RS485

(1)CPU本身只会提供UART接口,而不会提供RS485接口。CPU根本不认识RS485。

(2)RS485使用时场景是:CPUA→UART转RS485——远距离通信—–RS485转UART→CPUB。

(3)RS485是纯硬件实现的,硬件芯片如MAX485来管理,根本不涉及软件编程。软件工程师只关注串口,只通过串口将数据发送出去或者接收回来即可。UART转485和485转串口对CPU来说是透明的。

(4)MAX485原理图

(5)RS485接线

 RS485的两根线A、B,A接A,B接B。这两根线组成差分信号,所以RS485为差分信号。

物联沃分享整理
物联沃-IOTWORD物联网 » 51单片机串口通信教程

发表评论