串口基本认知
-
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
- 是设备间接线通信的一种方式
- 数据一位一位地顺序传送
- 双向通信,全双工
- 传输速度相对较慢
-
关于电器标准和协议
串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。
-
RS-232
也称标准串口,最常用的一种[串行通讯接口,比如我们的电脑主机的9针串口 ,最高速率为20kb/s。
RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其传送距离最大为约15米。所以RS-232适合本地设备之间的通信。
-
RS-422
由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。
RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比。
-
RS-485
是从RS-422基础上发展而来的,无论四线还是二线连接方式总线上可多接到32个设备。
-
-
关于串口的电平
UART:异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。UART包含TTL电平的串口和RS232电平的串口。
-
RS232电平
逻辑1为-3~-15V的电压,逻辑0为3-15V的电压。
笔记本通过RS232电平和单片机通信如下图所示:
-
TTL电平
TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定:
+5V等价于逻辑”1”,0V等价于逻辑”0”。
数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定:
输出高电平>=2.4V,输出低电平<=0.4V;
输入高电平>=2.0V,输入低电平<=0.8V。
笔记本电脑通过TTL电平与单片机通信:
TX发送线 (端口) 3.1
RX接收线 (端口) 3.0
USB转TTL,使用ch340通信
上官一号
-
串口通信
-
串口接线方式
RXD:数据输入引脚,数据接受;STC89系列对应P3.0口,上官一号有单独引出
TXD:数据发送引脚,数据发送;STC89系列对应P3.1口,上官一号有单独引出
接线方式:
-
串口编程要素
-
输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器。
代码体现为: 想要接收数据
char data = SBUF;
想要发送数据SBUF = data;
。 -
回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率。
-
串口相关寄存器的配置以及串口的工作模式
-
串口相关寄存器
**
**STC89C51RC/RD+系列单片机的串行口设有两个控制寄存器:串行控制寄存器SCON和波特率选择特殊功能寄存器PCON。
-
PCON:电源控制寄存器
-
SCON:串行控制寄存器
-
波特率的计算
计算在方式1下,单片机工作在12T模式,晶振频率为11.0592MHz时,配置9600bps的TH1初值。
9600 = (2^0/32)×[11059200/12(256-TH1)]
经过计算,TH1=0xFD 。
-
单片机向PC发送字符串
-
代码
#include "reg52.h" #include "intrins.h" sfr AUXR = 0x8E; void Delay1000ms() //@11.0592MHz { unsigned char i, j, k _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //9600bps@11.0592MHz { AUXR = 0x01;//提升系统EMI性能 PCON = 0x00;//SMOD0 = 0时SCON中的SM0,和SM1一起指定串行口的工作方式 SCON = 0x40;//串口工作方式1,且REN=0,禁止串口接收 TMOD &= 0x0F; TMOD |= 0x20;//定时器1的工作方式8位自动重装 TH1 = 0xFD; TL1 = 0xFD;//9600bps的TH1初值 TR1 = 1;//启动定时器 } void send_byte(char data_msg) { SBUF = data_msg; while(!TI); TI = 0; } void send_str(char* data_msg) { while(*data_msg != '\0'){ send_byte(*data_msg); data_msg++; } } void main() { UartInit(); while(1){ Delay1000ms(); send_str("to be number one\r\n"); } }
-
串口中断控制led
/* 波特率9600 每隔一秒,单片机向PC发送一个字符串 PC上位机串口调试助手发送open点亮LED,发送close关闭LED */ #include "reg52.h" #include "intrins.h" #include "string.h" #define SIZE 12 sfr AUXR = 0x8E; sbit D5 = P3^7; char cmd[SIZE]; void Delay1000ms() //@11.0592MHz延时函数 { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //9600bps@11.0592MHz { AUXR = 0x01;//提升系统EMI性能 PCON = 0x00;//SMOD0 = 0时SCON中的SM0,和SM1一起指定串行口的工作方式 SCON = 0x50;//串口工作方式1,且REN=0,允许串口接收 TMOD &= 0x0F; TMOD |= 0x20;//定时器1的工作方式8位自动重装 TH1 = 0xFD; TL1 = 0xFD;//9600bps的TH1初值 TR1 = 1;//启动定时器 EA = 1;//开启总中断 ES = 1;//开启串口中断 } void send_byte(char byte)//发送一个字符 { SBUF = byte;//把数据写入发送缓冲区SBUF while(!TI);//数据发送完的标志是TI=1,所以等待数据发送完 TI = 0;//软件清零 } void send_str(char* data_msg)//发送一个字符串 { while(*data_msg != '\0'){ send_byte(*data_msg); data_msg++; } } void main() { D5 = 1;//初始化led为熄灭 UartInit();//串口初始化 while(1){ Delay1000ms(); send_str("to be number one\r\n");//发送字符串 带换行:\r\n } } void uart_handler() interrupt 4 //串口中断 { static int i =0;//静态变量,只被初始化一次 if(RI){ RI = 0; cmd[i] = SBUF;//接收缓冲区的数据给cmd[i],串口传输数据是一位一位的传输 i++; if(strstr(cmd,"open")){ D5 = 0; i = 0; memset(cmd,'\0',SIZE); } if(strstr(cmd,"close")){ D5 = 1; i = 0; memset(cmd,'\0',SIZE); } } if(TI); }