串口通信初识
- 1、串口的基本认识
- 2、串口的电平
- 3、接线方式
- 4、通过单片机向PC发送每隔1s发送一个字符A
1、串口的基本认识
-
串口也就是接口,称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。用来进行数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(全双工)(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
-
分类:按电气标准及协议来分包括RS-232-C、RS-422、RS485等。
-
RS232:常见的9针串口,最高速率为20Kb/s,传输最大距离15m。如下图所示。
-
RS422:最多可接10个节点。即一个主设备,其余为从设备,从设备之间不能通信。最大传输距离为1219m,最大传输速率为10Mb/s。
-
RS485:就是RS422的拓展,可以连接更多的设备
2、串口的电平
- UART:异步串行,指主设备和从设备之间进行传输数据的频率是不同的,比如单片机向模块发送数据的频率 ≠ 模块向单片机接收数据的频率。这就是所说的波特率,一般我们需要配置波特率
串口电平:
- RS232电平:1为-3~-15V的电压, 逻辑0为3~15V的电压
- TTL电平:输出高电平>=2.4V,输出低电平<=0.4V;
输入高电平>=2.0V,输入低电平<=0.8V,上官一号使用的是TTL电平。
笔记本怎样和上官一号之间进行通信喃?
- 通过只用CH340芯片将USB转TTL。TX发送线,RX接收线。
3、接线方式
- RXD:数据接收引脚,数据读取;STC89系列对应P3.0口,
TXD:数据发送引脚,数据写入;STC89系列对应P3.1口,
如图,交叉连接,单片机的输入引脚连接模块的输出引脚,这样双方才能相互接收和发送数据。
4、通过单片机向PC发送每隔1s发送一个字符A
一、
- 数据缓冲器SBUF:主要用来缓存数据的,分为接收数据缓冲器和发送数据缓冲器,都是独立8位寄存器。
- 单片机想要发送数据:则给SBUF写入数据,SBUF = data;
- 单片机想要接收数据:则读取SBUF里面的数据,让data = SBUF;
二、
-
不仅要配置SBUF寄存器,还需要配置波特率,要2个设备之间的波特率一样,才能进行数据的传输
-
PC机的接收方波特率我们配置位9600,无校验位和停止位。
-
而单片机的波特率的配置,代码比较麻烦,我们先用软件自动生成,然后参考它配置了那些东西在进行学习。
-
生成的代码如下:
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
}
2给设备都配置好后,我们开始编写剩余代码向PC机发送数据
#include <REGX52.H>
#include "intrins.h"//nop()函数的头文件
sfr AUXR = 0X8E;//reg52.h里面没有定义AUXR的地址,所以我们自己查看手册定义
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
{
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()
{
int data_sj = 'A';
UartInit();
while(1)
{
Delay1000ms();
SBUF = data_sj;//给SBUF写入数据,完成了数据的发送
}
}
如图:PC机每隔1s接收到一个字符A。