1 通信有关的常见概念
1.1 什么是通信
(1)人和人之间的通信:说话、写信、狼烟、手势等。
(2)人和计算机之间的通信:按键、显示器、鼠标、触摸屏等。
(3)计算机和计算机之间的通信?
1.2 通信的关键
(1)事先约定。
(2)基本信息单元。
(3)有效信息的编码、传输和解码。
1.3 通信的专业性概念
(1)同步和异步。
(2)单工、半双工、全双工。
(3)并行和串行。
(4)电平信号和差分信号。
2 什么是串行通信
2.1 串口通信基础
(1)一种特定的通信协议。
(2)串行通信、串口通信、UART、USART。
(3)异步、串行、全双工。
2.2 串行通信的主要用途
(1)早期:计算机之间短距离通信(15米内),完备通信机制。
(2)现在:CPU之间近距离通信、调试信息输入输出,非完备通信。
2.3 串行通信的工作方式
(1)3根线(GND、RxD、TxD)或者9根线,receive、transmit。
(2)发送方有发送移位寄存器,接收方有接收移位寄存器。
(3)数据在发送方和接收方的CPU中都以字节为单位整字节处理。
(4)数据在通信线上以位为单位逐个bit的传输。
2.4 串行通信的主要概念
(1)起始位、数据位、奇偶校验位、停止位(帧)。
(2)波特率:一秒钟传输多少个bit位,发送方和接收方必须波特率设置为一样。
(3)流控:速率协商,现在一般都要禁用掉。
3 51单片机的串行通信
3.1 先搞清楚以下问题
(1)串行通信功能是SoC的一个(内部)外设提供的,与CPU本身无关。
(2)各种不同SoC的串行通信大同小异。
(3)串行通信经常作为主控SoC与其他外部芯片之间的通信接口。
3.2 STC51单片机的串行通信简介
4 STC51的串行通信相关寄存器
STC90C51RC/RD+系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。串行控制寄存器SCON用来选择串行通信的工作方式和某些控制功能。
4.1 SCON
SM0/FE SM1 SM2 REN TB8 RB8 TI RI
0 1 0 1/0 0 0 0 0 0x40/0x50
4.2 PCON
SMOD SMOD0 -
1/0 0 0x80/0x00
4.3 串口发送时的软硬件协作方式
(1)查询方式。硬件在发送完一帧数据后会将一个标志位置位(标志位本来是0),软件需要不断读取这个标志位的值来判断硬件是否完成了发送(如果读出来是0就表示硬件还在发还没完还在忙,所以我们就不能认为硬件发完了,所以就不能给硬件安排下一帧数据的发送;如果读出来的是1则说明硬件已经发完了上一帧数据,这时候软件就应该给硬件再给一帧数据去发送)。 因为串口发送完这个事件对CPU来说是个异步事件,所以这里查询方式来处理和之前讲过的查询方式处理按键是非常类似的。
(2)中断方式。查询方式处理的劣势是CPU必须一直守着串口发送,在串口发送完所有字节之前CPU不能离开去做别的事情,这对CPU来说是极大的浪费(因为CPU的速度比串口发送的速度快多了)。因此用中断方式来处理串口发送是非常合适的,可以提升CPU使用率。
(3)常见情况下:串口发送会使用查询方式,而串口接收会使用中断方式。
4.4 波特率加倍
(1)所谓波特率加倍,就是正常计算出的波特率假设是2400,那么SMOD=1时则实际的波特率就是4800;当SMOD=0时不加倍,也就是2400还是2400。
5 STC51的串行通信实战
5.1 硬件接线分析
(1)目标:将PC机与51单片机通过串口连接起来。
(2)PC机的串口情况:台式机串口、笔记本USB转串口。
(3)开发板原理图分析。
MAX232芯片的作用是:在RS232电平(DB9为RS232电平)和TTL电平(单片机内部使用的为TTL电平)之间做转换。
5.2 接线方案
(1)使用板载CH340:什么都不用动,默认就用这个,最简单最省事,最推荐。
(2)使用DB9接口USB转串口线:用DB9接口的USB转串口线、注意跳线冒接到DB9一侧。
(3)使用TTL接口USB转串口线:只接三根线:TxD、RxD、GND。
5.3 使用板载CH340进行串口实践
(1)接线+下载程序。
(2)查设备管理器确定COM号。
(3)使用普中下载软件自带的串口助手监视。
(4)使用第三方串口助手软件监视。
(5)使用SecureCRT软件监视。
5.4 使用DB9接口USB转串口线
(1)接线+跳线帽调整。
(2)注意对下载程序的影响。
(3)使用各种方式进行监视。
5.6 代码实践
(1)串口初始化。
(2)波特率计算。
(3)串口发送字符。
(4)串口发送字符串。
(5)串口接收函数编写。
#include
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay(void);
void uart_send_string(unsigned char *str);
void main(void)
{
uart_init();
uart_send_string("串口回环测试
");
while (1);
}
void uart_init(void)
{
SCON = 0x50;
PCON = 0x80;
TMOD = 0x20;
TH1 = 243;
TL1 = 243;
TR1 = 1;
ES = 1;
EA = 1;
}
void uart_send_byte(unsigned char c)
{
SBUF = c;
while (!TI);
TI = 0;
}
void uart_send_string(unsigned char *str)
{
while (*str != '