51单片机的串口驱动的代码逻辑

什么是串口通信?

51单片机中,串口通信指的是单片机和其他的机器传递数据的时候是通过一个bit一个bit的形式传输的,值得一提的话,串口通信是硬件串口。什么意思呢?也就是在传递比特的时候,不用软件来模拟比特传输时的时序,由硬件自动传输。那么需要发送的数据怎么告诉硬件让其传输的呢?由于在软件串口中,比特和比特的传输是实时的,数据源直接传给收取源,这个是没有中间的缓存的,没有缓存的数组或者是缓存的寄存器。而硬件串口的话,由于你要交给一个封装好的硬件串口模块,则这个模块必须得有一个接口,这个接口就是SBUF(一个字节),内置的寄存器(其实有两个,一个只读,一个只写),作为需要输出和输入的一个中间人,所以所有通过串口输入输出的字节都是需要通过这个SBUF的,所以就会出现上一篇文章讲的SBUF被覆盖的问题,所以每次数据源——SBUF——串口通信,这个阶段就必须得上一个锁什么时候解锁呢?当串口传输完了8个字节的时候,内部硬件自动将TI或者是RI置为1,进而触发串口中断,这个时候就需要到串口中断中处理查看,看看是接受完了一个字节,还是发送完了一个字节,在处理中断程序中,如果是发送完成,则就解锁,让数据源将后续的数据赋值到SBUF中,进而通过SBUF通过串口通信发送出去。

(一个重要的原则:如果你的主机作为发送方的话,不需要考虑发送的数据是以什么形式存到接收方里面的,你只需要负责发送数据就好了。只有接收的才是需要考虑到缓存的事情的。)

串口通信的代码逻辑

有缓存串口通信的思路:由于串口通信是硬件串口,所以需要借助SBUF的帮助,存储字节,所有输入输出的字节都是需要经过SBUF才可以出去的。输出的时候不用缓存,输入的时候才有缓存。

输出的时候,字节通过SBUF,然后再经过SBUF进行输出,等到SBUF输出完毕的时候,触发中断,再进行第二字节的输出。

输入的时候,先输入进SBUF,等SBUF输入满的时候,那么就触发中断,将SBUF中的一个字节,写到缓存中去,再进行下一个字节的接收,在字节接收到缓存的过程中,同时又在将缓存中的数读出来,读到一个空的数组当中去,但是有些时候,从缓存读到数组中的速度有些块,这个时候就需要等待SBUF中的字节写到缓存中,才能将缓存中的字节写到空数组中,所以最得判断一下,这个缓存是否是空的,如果是空的话,那么就延迟一毫秒,再读一遍,如果下一个循环还是0的话,那么就是真的已经读完了。

这个就是上述输入输出的全过程。

需要注意的点:

(1)发送字节的时候,记得上锁,否则会出现SBUF发送到一半字节而出现覆盖的情况。

(2)需要重视一下buffer——>外部空数组读取太快的问题。

(3)其中的缓存是全部利用的,不用考虑字符串最后一个是0的问题

(4)字符串最后一个是0的问题,一般是放到暴露函数中处理。

(5)创建的缓存可以封装成一个结构体,且这个缓存是一个循环队列,这个循环队列有队首和元素的个数,其中用(队首 + 元素个数)%max 组成了队尾,队尾就是下一个元素加进来的地方。

串口通信首先就是初始化,使用到了好几个寄存器,IE,SCON,PCON,TCON等寄存器,还有TMOD和TH和TL的初始化,这个一定需要倒背如流。

我们先来看看需要暴露的函数有哪些:初始化函数,发送字符串的函数,收取字符串的函数,判断缓存中是否有元素的函数。

内部的函数有那些呢:初始化函数,发送字符串的函数,收取字符串的函数,判断缓存中是否有元素的函数。发送单个字节的函数,收取单个字节的函数,从SBUF到缓存的函数,从缓存到空数组的函数。

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

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

相关文章

fanout(扇出模型)

在广播的流程下,消息发送的流程如下: 可以有多个消费者。 每个消费者有自己的queue(队列)。 每个队列都要绑定到Exchange(交换机)。 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者也无法决…

oracle物化视图

物化视图定义 视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集,每次访问它都会导致这个查询语句被执行一次,为了避免每次访问都执行这个查询,可以将这个查询结果集存储到…

【算法题】矩阵顺时针旋转90° (js)

力扣链接:https://leetcode.cn/problems/rotate-matrix-lcci/description/ 本人题解: /*** param {number[][]} matrix* return {void} Do not return anything, modify matrix in-place instead.*/ var rotate function (matrix) {const x matrix.le…

Spring高手之路-Spring事务的传播机制(行为、特性)

目录 含义 七种事务传播机制 1.REQUIRED(默认) 2.REQUIRES_NEW 3.SUPPORTS 4.NOT_SUPPORTED 5.MANDATORY 6.NEVER 7.NESTED 含义 Spring事务的传播机制是指在多个事务方法相互调用时,如何处理这些事务的传播行为。对应七种事务传播行为…

【Git】git基础

Git 命令 git config --globle user.name ""git config --globle user.email ""git config -lgit config --globle --unset []git add []git commit -m ""]git log//当行且美观 git log --prettyoneline//以图形化和简短的方式 git log --grap…

Halcon闭运算closing

Halcon闭运算 文章目录 Halcon闭运算 闭运算的计算步骤,为先膨胀,后腐蚀。这两步操作能将看起来很接近的元素,如区域内部的空洞或外部孤立的点连接成一体,区域的外观和面积也不会有明显的改变。通俗地说,就是类似于“填…

Linux 权限掌控术:深入探索和用户管理

文章目录 前言1.外壳程序是什么?外壳程为什么存在?工作原理外壳程序怎么个事? 2. Linux权限的概念2.1 什么是权限2.2权限的本质2.3 Linux中的用户 3. 普通用户变成rootlinux中有三种人 4.Linux中文件的权限4.1文件的属性权限4.2 掌握修改权限…

TCP发送和接受数据

发送数据 public class sendmessage {public static void main (String[] args) throws IOException {//创建socket对象//在创建的同时会连接服务器,若连接不上,代码会报错Socket socketnew Socket("127.0.0.1",10086);//从连接通道中获取输出流OutputStream ossock…

2024.1.1每日一题

LeetCode每日一题 新的一年开始了,祝大家新年快乐,坚持做每日一题。 1599.经营摩天轮的最大利润 1599. 经营摩天轮的最大利润 - 力扣(LeetCode) 题目描述 你正在经营一座摩天轮,该摩天轮共有 4 个座舱 &#xff0…

DevOps系列之 JNI实现Java调用C的实现案例

JNI(Java Native Interface)允许Java代码与其他语言编写的代码进行交互。以下是一个简单的JNI示例,演示如何使用JNI在Java中调用C/C函数。 最终的目录结构如下: JNI(Java Native Interface)允许Java代码与其…

服务器硬件及RAID配置实战

目录 1、RAID的概念 2、RAID的实现方式 3、标准的RAID 3.1 RAID 0 3.2 RAID 1 3.3 RAID 5 3.4 RAID 10 4、建立硬件 RAID的过程步骤 1、进入RAID 1.1 重启服务器 1.2 进入RAID界面 1.3 在RAID界面切换目录 2、创建RAID 2.1 移动到RAID卡 2.2 按F2,选择…

lenovo联想拯救者8.8英寸掌上游戏机Legion Go 8APU1(83E1)原装出厂Windows11预装系统

链接:https://pan.baidu.com/s/1d586XWXcAWVxlLyV2Oku7Q?pwdd74t 提取码:d74t 系统自带所有驱动、出厂主题壁纸、Office办公软件、联想电脑管家等预装程序 所需要工具:16G或以上的U盘 文件格式:ISO 文件大小:…

C# json 转匿名对象及C#关键字的处理

调用第三方接口&#xff0c;返回的json字符串&#xff0c;为了方便使用转为C#匿名对象&#xff1a; /// <summary>/// json转为匿名对象/// </summary>/// <typeparam name"T"></typeparam>/// <param name"json"></para…

适用于各种危险区域的火焰识别摄像机,实时监测、火灾预防、安全监控,为安全保驾护航

火灾是一种极具破坏力的灾难&#xff0c;对人们的生命和财产造成了严重的威胁。为了更好地预防和防范火灾&#xff0c;火焰识别摄像机作为一种先进的监控设备&#xff0c;正逐渐受到人们的重视和应用。本文将介绍火焰识别摄像机在安全监控和火灾预防方面的全面应用方案。 一、火…

8.Java异常处理和错误码 注意点

异常问题 (一) 错误码 1.【强制】错误码的制定原则&#xff1a;快速溯源、沟通标准化。 说明&#xff1a; 错误码想得过于完美和复杂&#xff0c;就像康熙字典中的生僻字一样&#xff0c;用词似乎精准&#xff0c;但是字典不容易随身 携带并且简单易懂。 正例&#xff1a;错误…

操作系统(Operator System)

这里写目录标题 1. 什么是操作系统2. 主要功能3. 计算机的层状结构4. 什么叫做管理5. 总结6. 为什么要有操作系统7. 最后 1. 什么是操作系统 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运…

CRM客户关系管理系统

系统开发环境以及版本 操作系统&#xff1a; Windows_7集成开发工具&#xff1a; Eclipse EE_4.7编译环境&#xff1a;JDK_1.8Web服务器&#xff1a;Tomcat_9.0数据库&#xff1a;MySQL_5.7.23 系统框架 spring框架springmvc框架mybatis框架Logback日志框架安全验证框架maven框…

你逛过凌晨四点的校园吗?--大四毕业生的年终总结

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 又是一年的年终总结&#xff0c;我也迎来了自己的毕业季&#xff0c;没错&#xff0c;我马上要毕业啦&#xff01;不知道大家是什么时候认识我的呢&#xff0c;又或者是第一次发现我~这一年&#xff0c;迎接过朝阳、拍下过…

Filezilla使用

服务端 点击安装包 点击我接受 点击下一步 点击下一步 点击下一步 点击安装即可 配置用户组&#xff0c;点击编辑&#xff0c;出现组点击 点击添加&#xff0c;点击确定即可 配置用户&#xff0c;点击编辑点击用户 点击添加&#xff0c;设置用户名&#xff…

搭建 Mac系统Arduino + MindPlus开发环境

搭建 Mac系统Arduino MindPlus开发环境 1.概述 2024年1月1号&#xff0c;元旦大家的安排丰富多彩&#xff0c;在这一天中我的安排依旧坚持初心&#xff0c;牢记使命。学习是我的起点也是我的终点&#xff0c;只要活着就要用知识丰富自己的生活。 今天是一个有意义的日子&…