目录
一、并行通信与串行通信
MCU与外部设备进行通信的两种方式:并行通信和串行通信。
并行通信:数据的各个位用多条数据线同时进行传输(一位数据占据一条数据线)。
串行通信:将数据分成一位一位的形式在一条传输线上逐个传输。
二、串行通信方式
串行通信有两种通信方式:同步通信和异步通信。
2.1 同步通信
数据传输时带有时钟同步信号,发送端与接收端在同一时钟的约束下进行数据传输,比如发送端与接收端均在时钟信号的上升沿进行数据的发送/接收。
2.2 异步通信
数据传输时不带时钟同步信号,发送端有自己的时钟CLK1,接收端有自己的时钟CLK2。发送端和接收端通过波特率来进行同步 。比如波特率为9600时,发送端需要在1s内发送9600比特数据,接收端需要在1s内接收9600比特数据。至于发送/接收这9600比特的数据对于发送端/接收端来说需要多少个时钟周期,就不重要的。
三、串行通信方向
串行通信的方向包括:单工、半双工、全双工。
单工:数据只能按照指定方向沿着一个方向传输(类似单行道,不可以逆行);
半双工:数据传输可以沿着两个方向,但是需要分不同的时间进行(类似潮汐车道,道路是唯一的,但是可以根据不同的时间规定不同的传输方向);
全双工:数据可以同时进行双向传输(一条马路上既有从A向B的车道,又有从B向A的车道,可以同时通行,两条车道互不干扰)。
四、UART
UART是一种采用异步串行通信方式的通用异步收发传输器。
UART数据格式是指UART传输的数据包的组成和结构,包括起始位、数据位、校验位和停止位。UART数据格式如下:
起始位:标志数据传输的开始,一般为0。
数据位:传输的实际数据,长度可以是5到9位。
校验位:用于检测数据是否有误,可以是奇校验或偶校验,也可以无校验。数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。
停止位:标志数据传输的结束,一般为1,长度可以是1到2位。
UART数据格式的示意图如下:
数据线在未发送数据之前,处于空闲状态。当 准备要发送数据时,先拉低一位,作为起始位。之后,接收端就能知道在起始位之后的n位数据就是数据位了(事先约定好了数据位是几位,8bit常用)。之后紧接着跟着一位校验位、一位停止位。对于校验位,分为奇校验和偶校验。
五、波特率
传输速率(波特率):表示每秒传输二进制数据的位数,单位是bps(位/秒)。
常用的为:9600,19200,38400,57600,115200等。
假设波特率为115200,波特率为115200就是指在1S内传输115200bit数据,1s等于10的9次方ns。所以传输1bit的数据需要10的9次方/115200=8680ns;
六、示例代码
以下代码为stc8H系列单片机串口2初始化子函数及串口2发送一个字节子函数。
/****************************************************************************************
* @名称 void uart2_init(long baud)
* @功能 串口二初始化
* @输入参数 baud - 串口波特率
* @返回 none
****************************************************************************************/
void uart2_init(long baud)
{
timer2_init(65536UL - (MAIN_FOSC/4)/baud);
S2CON &= ~(1<<7); // 8位数据, 1位起始位, 1位停止位, 无校验
IE2 |= 1; //允许中断
S2CON |= (1<<4); //允许接收
P_SW2 &= ~0x01;
P_SW2 |= 0; //UART2 switch to: 0: P1.0 P1.1, 1: P4.6 P4.7
}
/****************************************************************************************
* @名称 void uart2_send_char(unsigned char dat)
* @功能 串口二发送一个字节
* @输入参数 dat - 待发送的数据
* @返回 none
****************************************************************************************/
void uart2_send_char(unsigned char dat)
{
S2BUF = dat;
while(!(S2CON & 2));
S2CON &= ~2;;
}