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为模式2TH1 = 243;TL1 = 243;      // 8位自动重装,意思就是TH1用完了之后下一个周期TH1会// 自动重装到TL1去TR1 = 1;        // 开启T1让它开始工作ES = 1;EA = 1;/*// 波特率不加倍SCON = 0x50;    // 串口工作在模式1(8位串口)、允许接收PCON = 0x00;    // 波特率不加倍// 通信波特率相关的设置TMOD = 0x20;    // 设置T1为模式2TH1 = 249;TL1 = 249;      // 8位自动重装,意思就是TH1用完了之后下一个周期TL1会// 自动重装到TH1去TR1 = 1;        // 开启T1让它开始工作ES = 1;EA = 1;
*//*// 波特率9600SCON = 0x50;    // 串口工作在模式1(8位串口)、允许接收PCON = 0x00;    // 波特率不加倍// 通信波特率相关的设置TMOD = 0x20;    // 设置T1为模式2TH1 = 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来说是透明的。

串口通信和RS485相关推荐

  1. 【STC单片机学习】第十三课:串口通信和RS485

    [朱老师课程总结 侵删] 第一部分.章节目录 1.13.1.通信有关的常见概念 1.13.2.什么是串行通信 1.13.3.51单片机的串行通信 1.13.4.STC51的串行通信相关寄存器1 1.1 ...

  2. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(RS485)

    一.开发板平台简介: 1.开发板资源简介 (1)开发板主芯片型号:STM32L431RCT6 (2)开发板主芯片封装:LQFP-64_10x10x05P (3)开发板主芯片内核:ARM® Cortex ...

  3. 【正点原子FPGA连载】 第十七章 RS485串口通信实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  4. STM32串口通信详解(嵌入式学习)

    STM32串口通信 1.通信基础知识 1.1 时钟信号区分 同步通信 异步通信 波特率 总线协议(电气协议) 1.2 通信方式划分 串行通信 并行通信 1.3 通信方向划分 单工通信 半双工通信 全双 ...

  5. python实现485通讯_Python编程实现USB转RS485串口通信

    ---作者疆,未经允许,严禁转载,违权必究--- ---欢迎指正,需要源码和文件可站内私信联系--- -----------点击此处链接至博客园原文----------- 功能说明:Python编程实 ...

  6. linux下rs422串口通信,RS232/RS422/RS485通信接口區別

    一 串口控制 通常我們對於視頻服務器.錄像機.切換台等直接播出.切換控制主要使用串口進行,主要使用到RS-232.RS-422與RS-485三種接口控制.下面就串口的接口標准以及使用和外部插件和電纜進 ...

  7. STM32CubeIDE开发(二十二), stm32的RS485/232串口通信开发要点

    一.stm32串口通信 stm32串口通信一般是指通过UART(Universal Asynchronous Receiver/Transmitter)通用异步收发传输器传输数据,UART 作为异步串 ...

  8. Matlab Simulink RS-485 Modbus RTU协议串口通信实录

    目录 一.目标实现 二.基本原理 三.过程实录 一.基本原理 一.目标实现 最近需要进行一个大型试验,需要实现:通过上位机来实时收集波高仪数据并经过一系列复杂算法来控制下位机(IO模块即继电器)从而控 ...

  9. (RS485 232串口通信数据解析实用干货(1)

    文章目录 (RS485 232串口通信数据解析实用干货(1) 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 ...

最新文章

  1. 多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)
  2. [云炬创业基础笔记]第一章创业环境测试9
  3. mysql触发器 多个条件_当条件为真时,如何使用MySQL触发器更新多个表?
  4. MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)
  5. Python库:Imageio库(待完善)
  6. Javascript详解
  7. 计算机系大学生为什么选择在CSDN写博客?
  8. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 G题 数学思维
  9. python如何更改背景颜色_python背景颜色,python改背景色
  10. Windows获取本地安装软件详细信息(对标卸载程序控制面板)
  11. 水井坊:“高端化”的尴尬与库存危机
  12. 【毕业设计】深度学习水果识别系统 - python CNN
  13. JAVA:实现一个CircularQueue循环队列算法(附完整源码)
  14. 智引万物论剑AI,商汤科技欲打造颠覆式创新引擎
  15. 发多少范德萨范德萨范德萨范德萨
  16. 关于springcloud中eureka server端配置的一些总结
  17. 如何绘制motif结构图
  18. croeElec 蓝牙连接ps3手柄的正确方式 Armbian 搞机篇
  19. android自动刷广告软件是,android开发通过辅助服务实现自动刷抖音极速版赚金币。。。。...
  20. 【转】TwinCAT PLC 使用

热门文章

  1. idea连接数据库实现增删改
  2. C语言正则表达式详解
  3. 申请ISO9001质量管理体系认证有5个程序
  4. AngularJs Cookies 操作
  5. PayPal Android SDK 2.0 支付
  6. php(TP5)+redis实现秒杀抢购(限制用户购买次数)(附源码)
  7. MAC重装Catania 10.15.5操作系统,附带下载地址。
  8. 关于python deepcopy内存问题
  9. 分布式事务及解决方案
  10. 软件测试BUG生命周期