一、串口基本认知概念
串口是一种用于在计算机或其他设备之间进行数据传输的通信接口。串口传输是通过发送和接收数据位来进行的,通常是一个字节一个字节地传输。串口通常有多种参数设置,比如波特率、数据位、校验位和停止位等,这些参数需要在通信的双方设备之间进行匹配才能确保正常的数据传输。串口常用于连接计算机与外围设备(比如打印机、调制解调器、传感器等),或者在嵌入式系统中进行设备之间的通信。串口通常分为RS-232、RS-485、RS-422等不同的标准,每种标准有不同的应用场景和特点。
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个设备
二、
三、程序
3.1 发送数据
cpp
#include "reg52.h"
#include "intrins.h"
sbit ledOne = P3^7;
sfr AUXR =0X8E;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式
TL1 = 0xFD; //设定定时初值
TH1 = 0xFD; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
void main()
{
char buf_msg = 'U';
ledOne = 0;
UartInit();
while(1) {
Delay1000ms();
SBUF = buf_msg;
}
}
3.2 发送字符串
cpp
#include "reg52.h"
#include "intrins.h"
sbit ledOne = P3^7;
sfr AUXR =0X8E;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//void UartInit(void) //9600bps@11.0592MHz
//{
// PCON &= 0x7F; //波特率不倍速
// SCON = 0x50; //8位数据,可变波特率
// AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
// TMOD &= 0x0F; //清除定时器1模式位
// TMOD |= 0x20; //设定定时器1为8位自动重装方式
// TL1 = 0xFD; //设定定时初值
// TH1 = 0xFD; //设定定时器重装值
// ET1 = 0; //禁止定时器1中断
// TR1 = 1; //启动定时器1
//}
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x40;
TMOD &= 0XF0;
TMOD |=0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
}
void sendbuf(char data_msg)
{
SBUF = data_msg;
while(!TI);
TI = 0;
}
void sendstr(char* str)
{
while(*str != '\0')
{
sendbuf(*str);
str++;
}
}
void main()
{
char buf_msg = '8';
ledOne = 0;
UartInit();
while(1) {
Delay1000ms();
// sendbuf(buf_msg);
sendstr("shua\r\n");
}
}
3.3 发送指令控制LED
cpp
#include "reg52.h"
#include "intrins.h"
sbit ledOne = P3^7;
sfr AUXR =0X8E;
char cmd;
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//void UartInit(void) //9600bps@11.0592MHz
//{
// PCON &= 0x7F; //波特率不倍速
// SCON = 0x50; //8位数据,可变波特率
// AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
// AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
// TMOD &= 0x0F; //清除定时器1模式位
// TMOD |= 0x20; //设定定时器1为8位自动重装方式
// TL1 = 0xFD; //设定定时初值
// TH1 = 0xFD; //设定定时器重装值
// ET1 = 0; //禁止定时器1中断
// TR1 = 1; //启动定时器1
//}
void UartInit(void) //9600bps@11.0592MHz
{
AUXR = 0x01;
SCON = 0x50;
TMOD &= 0XF0;
TMOD |=0X20;
TH1 = 0XFD;
TL1 = 0XFD;
TR1 = 1;
EA =1;
ES =1;
}
void sendbuf(char data_msg)
{
SBUF = data_msg;
while(!TI);
TI = 0;
}
void sendstr(char* str)
{
while(*str != '\0')
{
sendbuf(*str);
str++;
}
}
void main()
{
char buf_msg = '8';
ledOne = 1;
UartInit();
while(1) {
Delay1000ms();
// sendbuf(buf_msg);
sendstr("shua\r\n");
}
}
void Uart_Handler() interrupt 4
{
if(RI)
{
RI = 0;
cmd = SBUF;
if(cmd == 'o') {
ledOne= 0;
}
if(cmd == 'c') {
ledOne= 1;
}
}
if(TI);
}