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为差分信号。