串口通信和RS485

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 <reg51.h>

// 函数声明
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();
/*
    // 第2步:通过串口发送信息出去
    while (1)
    {
        uart_send_byte('x');
        delay();
    }
    */
/*
    // 测试发送字符串
    while (1)
    {
        //uart_send_string("abcdefg");
        uart_send_string("朱老师物联网大讲堂www.zhulaoshi.org");
        delay();
    }
 */
    uart_send_string("串口回环测试\r\n"); 
    while (1);


}




// 串口初始化函数
// 预设一个串口条件:8数据位、1停止位、0校验位、波特率4800
// 初始化的主要工作就是去设置相关的寄存器
void uart_init(void)
{
    // 波特率加倍的

    SCON = 0x50;    // 串口工作在模式1(8位串口)、允许接收
    PCON = 0x80;    // 波特率加倍,意思是本来需要波特率4800,等下计算时按
                    // 2400去计算就可以了。

    // 通信波特率相关的设置
    TMOD = 0x20;    // 设置T1为模式2
    TH1 = 243;
    TL1 = 243;      // 8位自动重装,意思就是TH1用完了之后下一个周期TH1会
                    // 自动重装到TL1去

    TR1 = 1;        // 开启T1让它开始工作
    ES = 1;
    EA = 1;



/*
    // 波特率不加倍
    SCON = 0x50;    // 串口工作在模式1(8位串口)、允许接收
    PCON = 0x00;    // 波特率不加倍

    // 通信波特率相关的设置
    TMOD = 0x20;    // 设置T1为模式2
    TH1 = 249;
    TL1 = 249;      // 8位自动重装,意思就是TH1用完了之后下一个周期TL1会
                    // 自动重装到TH1去

    TR1 = 1;        // 开启T1让它开始工作
    ES = 1;
    EA = 1;
*/
 /*
    // 波特率9600
    SCON = 0x50;    // 串口工作在模式1(8位串口)、允许接收
    PCON = 0x00;    // 波特率不加倍

    // 通信波特率相关的设置
    TMOD = 0x20;    // 设置T1为模式2
    TH1 = 253;
    TL1 = 253;      // 8位自动重装,意思就是TH1用完了之后下一个周期TL1会
                    // 自动重装到TH1去

    TR1 = 1;        // 开启T1让它开始工作
    ES = 1;
    EA = 1;

    */
}

// 通过串口发送1个字节出去
void uart_send_byte(unsigned char c)
{
   // 第1步,发送一个字节
   SBUF = c;

   // 第2步,先确认串口发送部分没有在忙
   while (!TI);

   // 第3步,软件复位TI标志位
   TI = 0;
}

void uart_send_string(unsigned char *str)
{
    while (*str != '\0')
    {
        uart_send_byte(*str);       // 发送1个字符
        str++;                      // 指针指向下一个字符
    }
}


void delay(void)
{
    unsigned char i, j;

    for (i=0; i<200; i++)
        for (j=0; j<200; j++);
}


void uart_isr(void) interrupt 4 using 1
{
    unsigned char tmp;

    if (RI)
    {
        tmp = SBUF;     // 读取SBUF,其实就是读出了串口接收到的1字节
        RI = 0;
    }
    // 至此已经读到了PC发给单片机的1个字节,但是单片机没有显示器没法显示
    // 给人看。
    // 我们这里用一个最简单的方法来测试,就是直接回发
    uart_send_byte(tmp);
}

6 RS485介绍

6.1 UART的缺点:传输距离受限

(1)理论上RS232不超过15米。

(2)理论上TTL电平通信距离更短。

(3)实际上几百米也有人宣称做到了,但是稳定性不能保证。

(4)波特率越高通信距离越近。

6.2 远距离传输怎么办?

(1)提高电压标准。

(2)提高通信线抗干扰能力、降低阻抗。

(3)使用差分信号。

6.3 RS485(RS422)

(1)最大通信距离1200多米,最快通信速率10Mbps,距离和速度成反比。

(2)差分信号负逻辑。

(3)更远距离可以加中继器。

(4)半双工。

(5)RS485只提供物理层通信能力,不提供数据层协议,需要用户自定义,或者使用标准协议如MODBUS协议。

6.4 MAX485介绍

(1)CPU本身只会提供UART接口,而不会提供RS485接口。CPU根本不认识RS485。

(2)RS485使用时场景是:CPUA->UART转RS485——远距离通信—–RS485转UART->CPUB。

(3)大家对RS485的理解,应该是这样的:RS485是纯硬件实现的,硬件芯片如MAX485来管理的,根本不涉及软件编程。软件工程师只关注串口,只通过串口将数据发送出去或者接收回来即可。UART转485和485转UART对CPU来说是透明的。

  • 9
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值