【单片机】12-串口通信和RS485

1.通信有关的常见概念

区分:串口,COM口,UART,USART_usart和串口区别-CSDN博客

串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客

1.什么是通信

(1)人和人之间的通信:说话,写信

(2)人和计算机之间的通信:按键,显示器,鼠标

(3)计算机和计算机之间的通信

2.通信的关键

(1)事先约定

(2)基本的信息单元

(3)有效信息的编码,传输和解码

3.通信的专业性概念

(1)同步和异步:同一个步调

(2)单工,半双工,全双工:数据传输方向

(3)并行和串口:并行(多根线),串行(单根线)

(4)电平信号【传输近,易受干扰】和差分信号【传输远,不易受干扰】:电平是通过高低电平进行区分,差分是相对的

2.串行通信

1.串口通信基础

(1)一种特定的通信协议【电平通信】

(2)串行通信,串口通信,UART,USART

(3)串口通信的特点:异步,串行,全双工

2.串行通信的主要用途

(1)早期:计算机之间短距离通信(1.5米内),完备通信机制

(2)现在:CPU之间近距离通信【CPU和周边芯片】,调试信息输入输出非完备通信

3.串行通信的工作方式

(1)3根线(GND,RxD【接收线】,TxD【发送线】---recive ,transmit)---不完备通信

或者9根线(DB9)-完备通信

(2)发送方有发送位移寄存器,接收方有接收移位寄存器

(3)数据在发送方和接收方的CPU中都以字节为单位整字节处理

(4)数据在通信线上以位为单位逐个bit的传输

4.串行通信的主要概念

传输都是一帧一帧的发

1.起始位

开始之前要发送一个起始位

2.数据位

比如我们传输“A”,转换为ASCII就是8位二进制,这8位就叫做8位数据位【有效数据】

数据位要双方沟通确定的

3.奇偶校验位

判断传输过程中是否出错

4.停止位(帧)

判断是否结束

5.波特率

串行通信的速度

一秒钟传输多少给bit位,发送方和接收方必须波特率设置为一样【波特率越小,传输速度慢,抗干扰能力越强】

6.流控

速率协商,现在一般要禁用掉

3.51单片机的串行通信

1.基础概念

SoC:把CPU以及其他功能集成到一个芯片上

(1)串行通信功能是SoC的一个(内部)外设提供的,与CPU无关【CPU=运算器+控制器】--CPU本身无法通信

(2)各种不同的SoC的串行通信大同小异【内部差不多,编程时候可能不同】

(3)串行通信经常作为主控SoC与其他外部芯片之间的通信接口【串行通信==SoC与外部其他芯片的通信】

2.STC51单片机的串行通信简介

4.STC51的串行通信相关寄存器

1.总体浏览

2.SCON:串行控制寄存器

3.SBUF:串行口缓存寄存器

4.PCON:电源控制寄存器

5.IE:中断允许寄存器

6.串口发送时的软硬件协作方式

(1)查询方式。硬盘在发送完一帧数据后会将一个标志位置位(标志位本来是0),软件需要不断读取这个标志位的值来判断硬件是否完成了发送(如果读出来的是0就表示硬件还在发还在发还没完还在忙,所以我们就不能认为硬件发完了,所以就不能给硬件安排下一帧数据的发送;如果读出来的是1则说明硬件已经发完了上一帧数据,这时候软件就应该给硬件在给一帧数据去发送)

(2)因为串口发送完这个事件对CPU来说是个异步事件(因为不知道什么时候发送消息),所以这里查询方式来处理和之前讲过的查询方式处理按键是非常类似的。

(3)常见情况下:串口发送会使用查询方式,串口接收会使用中断方式【因为不知道什么时候会接收到信息,使用中断才不会过度销毁CPU】

7.波特率加倍

PCON中的SMOD

所谓波特率加倍,就是正常计算出的波特率假设是2400,那么SMOD=1时则实际波特率就是4800;当SMOD=0时不加倍,也就是2400还是2400

5.STC51的串行通信实战

1.硬件接线分析

(1)目标:将PC机和51单片机通过串口连接起来

(2)PC机的串口情况:台式机串口,笔记本USB转串口

(3)开发板原理图分析

2.接线方案

1.使用板载CH340

什么都不用动,默认就是使用这个,最简单最省事,最推荐

2.使用DB9接口USB转串口线

用DB9接口的USB转串口线

注意:跳线帽接到DB9一侧

3.使用TTL接口USB转串口线

只接三根线:TxD,RxD,GND

4.总结

3.使用板载CH340进行串口实践

1.接线+下载程序

2.查看设备管理器确定COM号

3.方法一:使用普中下载软件自带的串口助手监视

4.方法二:使用第三方串口助手软件监视

5.方法三:使用SecureCRT软件监视

4.使用DB9接口USB转串口线

1.接线+下载程序

2.注意对下载程序的影响

此时无法进行程序下载

3.使用各种方式进行监视

5.串口初始化

//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x80;   //波特率加倍,意思是本来需要波特率4800,等一下计算时按照2400去计算就好}

6.波特率计算

SMOD---》判断是否进行波特率加倍【如果加倍则为1,不加倍则为0】

 查看数据手册中”串行通信中波特率的设置“

接着查看定时/计数器1的工作方式2的寄存器设置情况

TMOD=0x20;  //设置T1为模式2

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

我们刚刚在上面计算出TH1=243;,所以进行设置

TH1=243;
TL1=243;   //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中

 




7.串口发送字符【单个字符】

注意点:51单片机不一样,要先发送在检验有没有在发送

其他MCU都是先检验在发送

如果为【0】则表示在忙,如果为【1】则表示发送结束

//串口发送函数,发送一个字节
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}

8.测试一下

1.波特率不加倍

#include<reg51.h>//函数声明
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay();void main(){//第一步:初始化好串口到正确的状态uart_init();while(1){//为了调试方便,让A循环发送,才好监视//第二步:通过串口发送信息出去uart_send_byte('A');delay();}}void delay(){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<200;j++);}
}//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){//波特率不加倍的例子SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x00;   //波特率不加倍//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=249;TL1=249;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化}//串口发送函数,发送一个字节
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}

因为我们算出来的TH1和TL1=6.5,所以精确度可能会受到影响,我们将其设置为250 或者 249则结果都会输出乱码

2.换一个波特率:9600

我们前面算出TH1=6.5【这里我们的波特率为4800】,所以如果为9600则我们应该将【6.5/2=3.25】才是我们9600的结果


//波特率为9600SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x00;   //波特率不加倍//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=253;TL1=253;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化

9.串口发送字符串【多个字符】

#include<reg51.h>//函数声明
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay();
void uart_send_string(unsigned char *str);void main(){//第一步:初始化好串口到正确的状态uart_init();while(1){//发送字符串,也可以发送中文uart_send_string("abcdefg");delay();}}void delay(){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<200;j++);}
}//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){//波特率加倍的例子SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x80;   //波特率加倍,意思是本来需要波特率4800,等一下计算时按照2400去计算就好//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=243;TL1=243;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化}//串口发送函数,发送一个字节【单个字节】
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}//发送字符串【多个字符】
void uart_send_string(unsigned char *str)
{while (*str != '\0'){uart_send_byte(*str);		// 发送1个字符str++;						// 指针指向下一个字符}
}

10.串口接收函数编写

因为我们在程序执行过程中如果要接收PC机传输过来的数据,则表示程序要进行中断,则要进行中断处理。

void uart_isr(void) interrupt 4 using 1{
}

#include<reg51.h>//函数声明
void uart_init(void);
void uart_send_byte(unsigned char c);
void delay();
void uart_send_string(unsigned char *str);void main(){//第一步:初始化好串口到正确的状态uart_init();uart_send_string("串口回环测试\n");while(1);
}void delay(){unsigned char i,j;for(i=0;i<100;i++){for(j=0;j<200;j++);}
}//串口初始化函数
//预设一个串口条件:8位数据位,1停止位,0校验位,波特率4800
//初始化的主要工作就是去设置相关的寄存器
void uart_init(void){//波特率加倍的例子SCON=0x50; //串口工作在模式1(8位串口),允许接收PCON=0x80;   //波特率加倍,意思是本来需要波特率4800,等一下计算时按照2400去计算就好//通信波特率相关的设置//此处我们使用【方式1】---对应数据手册TMOD=0x20;  //设置T1为模式2TR1=1;	//开启T1让它开始工作TH1=243;TL1=243;    //8位自动重装,意思就是TH1用完了下一个周期TL1会自动重装到TH1中//中断初始化ES=1;//串口中断初始化EA=1;//整个中断初始化}//串口发送函数,发送一个字节【单个字节】
void uart_send_byte(unsigned char c){//【第一步】发送一个字节SBUF=c;//【第二步】先确认串口发送部分没有在忙while(!TI);//TI=0,表示在忙//【第三步】软件复位TI标志位---数据手册要求的TI=0;
}//发送字符串【多个字符】
void uart_send_string(unsigned char *str)
{while (*str != '\0'){uart_send_byte(*str);		// 发送1个字符str++;						// 指针指向下一个字符}
}//中断处理程序
void uart_isr(void) interrupt 4 using 1
{unsigned char tmp;if(RI){tmp=SBUF;   //读取SBUF,其实就是读出串口接收到的1个字节//RI:串行口1接收中断标志RI=0;}//自此已经读到了PC发给单片机的一个字节,但是单片机没有显示器无法显示//我们用最简单的方法,就是直接回发uart_send_byte(tmp);
}

6.RS485

1.UART的缺点:传输距离受限

(1)理论上RS232不超过15米--电脑的COM端口【DB9】

(2)理论上TTL电平通信距离更短---TTL是在单片机上使用

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

(4)波特率越高通信距离越短【速度越快,通信距离越短】

2.远距离传输

(1)提高电压标准

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

(3)使用差分信号--抗干扰能力强【RS485/RS422】

3.RS485(RS422)

(1)最大通信距离1200多米,最快通信速率10Mbps,距离和速度成反比(USB接口,网线)

(2)差分信号负逻辑【5V代表---0     -3V代表----1】

(3)更远距离可以加中继器【中继器---多个485的节点连接起来--放大】

(4)半双工【如果要实现全双工,则使用4根线】

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

4.MAX485

MAX485就是相当于UART与RS485之间的信号转换

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/91703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在枚举类中“优雅地”使用枚举处理器

使用枚举类的一大好处就是&#xff0c;代码易懂&#xff0c;方便自己或他人维护。如&#xff0c;枚举状态、异常等。 下面有两个类&#xff08;枚举类和实体类&#xff09;&#xff1a; package com.zhang.enums;import lombok.Getter;/*** Author lgz* Description* Date 202…

计算机网络之传输层

计算机网络 - 传输层 计算机网络 - 传输层 UDP 和 TCP 的特点UDP 首部格式TCP 首部格式TCP 的三次握手TCP 的四次挥手TCP 可靠传输TCP 滑动窗口TCP 流量控制TCP 拥塞控制 1. 慢开始与拥塞避免2. 快重传与快恢复 网络层只把分组发送到目的主机&#xff0c;但是真正通信的并不是…

消息中间件(二)——kafka

文章目录 Apache Kafka综述什么是消息系统&#xff1f;点对点消息类型发布-订阅消息类型 什么是Kafka?优点关键术语Kafka基本原理用例 Apache Kafka综述 在大数据中&#xff0c;会使用到大量的数据。面对这些海量的数据&#xff0c;我们一是需要做到能够收集这些数据&#xf…

安全渗透测试基础之漏洞扫描工具之Nessus使用介绍

前置条件:Nessus工具使用前要确保工具是服务状态 systemctl start nessusd.service 启动nessus服务 systemctl status nessusd.service 查看nessus服务状态 1.配置扫描模板 2.新增高级扫描 2.1 设置日程表: 2.2设置邮件收件人(可选): 2.3主机发现: 2.

Egg 封装接口返回信息

中间件封装 代码 const msgArr {"200":成功,"401":token失效 } module.exports (option, app) > {return async function(ctx, next) {try{//成功是返回的信息ctx.emit(code,data,msg)>{console.log(1111,code,data,msg)ctx.body {code,data:dat…

递推+模拟---想好如何存储?

递推模拟 输入输出问题CCF-CSP考试历年真题题型分类分组输入——可能有多组测试数据&#xff0c;对于每组数据 递推---从前面已知态--->后续未知态AcWing 3777. 砖块AcWing 1208. 翻硬币AcWing 1211. 蚂蚁感冒AcWing 3433. 吃糖果AcWing 821. 跳台阶 模拟202212-2-csp-训练计…

点亮一个LED+LED闪烁+LED流水灯——“51单片机”

各位CSDN的uu们好呀&#xff0c;这是小雅兰的最新专栏噢&#xff0c;最近小雅兰学习了51单片机的知识&#xff0c;所以就想迫不及待地分享出来呢&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入51单片机的世界吧&#xff01;&#xff01;&#xff01; 点亮一个…

NLP 02 RNN

一、RNN RNN(Recurrent Neural Network),中文称作循环神经网络它一般以序列数据为输入通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。 传统神经网络(包括CNN)&#xff0c;输入和输出都是互相独立的。但有些任务&#xff0c;后续的输出和之前…

华为云云耀云服务器L实例评测 | MacOS系统-宝塔建站

文章目录 1.华为云云耀云服务器L实例2.选择配置与购买2.1 华为云云耀云服务器L实例-套餐配置详情 3.宝塔镜像的使用3.1 重置实例的密码3.2 MacOS环境登录服务器3.2.1 查看内存使用情况 3.3 进入宝塔面板3.3.1 在安全组开放端口3.3.2 网站效果 1.华为云云耀云服务器L实例 云耀云…

毛玻璃态登录表单

效果展示 页面结构组成 通过上述的效果展示可以看出如下几个效果 底部背景有三个色块并且效果是毛玻璃效果登录表单是毛玻璃效果登录表单的周围的小方块也是有毛玻璃效果并且与登录表单有层次效果 CSS3 知识点 filter 属性backdrop-filter 属性绝对定位属性动画属性 底部背…

案例突破——再探策略模式

再探设计模式 一、背景介绍二、 思路方案三、过程1. 策略模式基本概念2. 策略模式类图3. 策略模式基本代码策略类抽象策略类Context类客户端 4. 策略模式还可以进行优化的地方5. 对策略模式的优化&#xff08;配置文件反射&#xff09; 四、总结五、升华 一、背景介绍 在做项目…

使用Qt验证RGB格式

下面我们用不同的颜色来绘制一块矩形区域&#xff0c;来对比学习RGB颜色。 一片漆黑的黑色 黑色在RGB中是三个颜色分量都是0。也就是没有颜色。 下面我们绘制一个水平100个像素&#xff0c;垂直200个像素的矩形区域&#xff0c;颜色设置为黑色。 #ifndef MAINWINDOW_H #def…

Lua如何调用C程序库

在Lua中加载和使用C库需要使用Lua的C API。以下是一个简单的示例&#xff1a; 首先&#xff0c;让我们创建一个C库。在C中&#xff0c;我们可以创建一个文件&#xff0c;如“mylib.c”&#xff0c;包含以下代码&#xff1a; #include <stdio.h> int add(int a, int b) …

Android Jetpack组件架构:ViewModel的原理

Android Jetpack组件架构&#xff1a;ViewModel的原理 导言 本篇文章是关于介绍ViewModel的&#xff0c;由于ViewModel的使用还是挺简单的&#xff0c;这里就不再介绍其的基本应用&#xff0c;我们主要来分析ViewModel的原理。 ViewModel的生命周期 众所周知&#xff0c;一般…

软件设计师_操作系统基本原理_学习笔记

文章目录 2.1 操作系统概述2.2 进程2.2.1 进程状态转换图2.2.2 前趋图2.2.3 进程的同步与互斥2.2.4 PV操作2.2.5 死锁 2.3 存储管理2.3.1 分区存储管理 2.1 操作系统概述 2.2 进程 2.2.1 进程状态转换图 2.2.2 前趋图 哪些任务可以并行&#xff0c;哪些任务有先后关系&#xf…

VS+Qt+C++ GDAL读取tif图像数据显示

程序示例精选 VSQtC GDAL读取tif图像数据显示 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC GDAL读取tif图像数据显示》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;…

Egg使用jwt拦截jtoken验证

安装 npm install egg-jwt注册插件 在config文件夹子下 plugin,js下 use strict;module.exports {//mysqlmysql: {enable: true,package: egg-mysql},//jwtjwt: {enable: true,package: egg-jwt} };使用中间件 在app文件下创建 middleware 文件夹 在middleware 文件下创建…

睿趣科技:新手抖音开店卖什么产品好

抖音已经成为了一款年轻人热爱的社交媒体应用&#xff0c;同时也成为了一种全新的电商平台。对于新手来说&#xff0c;抖音开店卖什么产品是一个备受关注的问题。在这篇文章中&#xff0c;我们将探讨一些适合新手的产品选择&#xff0c;帮助他们在抖音上开店获得成功。 流行时尚…

毛玻璃态卡片悬停效果

效果展示 页面结构组成 页面的组成部分主要是卡片。其中卡片的组成部分主要是包括了图片和详情。 卡片的动效是鼠标悬停在卡片上时&#xff0c;图片会移动到左侧&#xff0c;并且图片是毛玻璃效果。所以我们在布局的时候图片会采用绝对布局。而详情则是基础布局。 CSS3 知识…

【智能家居项目】裸机版本——项目介绍 | 输入子系统(按键) | 单元测试

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3c0;项目简介&#x1f3c0;输入子系统(按键)⚽应用层⚽设备层⚽ 内核层抽象层⚽…