串口接受时有关接受标志位详解

2023-11-06

①首先我们来看一下MDK对各位的描述
可以发现0~13位接受的是数据个数(填满相当于十进制的8191),
②那么既然0~13位数据量这么大,代码是如何实现对14、15位的修改呢?废话不多说,先上实现代码(原子哥编写):

        

 void USART1_IRQHandler(void) 
        {
        u8 Res;
        #ifdef OS_TICKS_PER_SEC //串口 1 中断服务程序//如果时钟节拍数定义了,说明要使用 ucosII 了.OSIntEnter();
        #endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        //接收中断(接收到的数据必须是 0x0d 0x0a 结尾)
        {
        Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
        if(USART_RX_STA&0x4000)//接收到了 0x0d 
        {
        if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
        else USART_RX_STA|=0x8000; //接收完成了 
        
        }
        else //还没收到 0X0D
        {
        if(Res==0x0d)USART_RX_STA|=0x4000;
        else
        { 
        
        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
        USART_RX_STA++;
        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
        //接收数据错误,重新开始接收
        }
        }
        }
        }
        #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用 ucosII 了.
        OSIntExit(
    
    );


③原子哥对这个协议的解释: 当接收到从电脑发过来的数据,把接收到的数据保存在USART_RX_BUF
中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(回车的表示由 2个字节组成: 0X0D 和
0X0A)的第一个字节0X0D 时,计数器将不再增加,等待 0X0A 的到来,而如果 0X0A
没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到 0X0A,则标记USART_RX_STA 的第 15
位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0X0D,那么在接收数据超过
USART_REC_LEN 的时候,则会丢弃前面的数据,重新接收。

那么大家可以也参考这位大佬的解析

https://blog.csdn.net/CALL_LKC/article/details/74375126

那么接下来就是关键了:
(1)USART_RX_STA这个在0~14位是用来存数据个数的,可以看到每次结束判断会有
USART_RX_STA++;而15、16位则是通过与运算来将高位置1
(2)Res这个是接收到的数据,可以看到有此函数
Res=USART_ReceiveData(USART1) (USART1->DR获得)
(3)USART_RX_BUF这个是用来保存接收到的数据的可以看到每次结束判断会有
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;

故此通过上面分析,不难理解

①if(Res==0x0d)USART_RX_STA|=0x4000;
意为一旦接收到0x0d数据(这个是系统自动生成的),那么USART_RX_STA第14位会被置为1(也就是我们所谓的标记)
②if(USART_RX_STA&0x4000)//接收到了 0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else
USART_RX_STA|=0x8000; //接收完成了
}

这个就意味着第一个if条件满足了(前面分析了,第14位置为1标记好了),接下来就是所谓的“等待0x0a的到来(这个也是系统自动生成的而且是紧接着0x0d,没有紧接着收到的话那么就意味着接受错误)”那么一旦接受完了0x0d和0x0a那么就将第15位置1(也是我们所谓的标记)那么到这里数据就已经接受完毕。那么什么时候重新接受呢?可以看到函数最后有这样一行
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;这时USART_RX_STA所有位清0,重新接收!
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口接受时有关接受标志位详解 的相关文章

随机推荐

  • exec函数族

    前言 exec函数族提供了一个在进程中启动另一个程序执行的方法 它可以根据指定的文件名或目录名找到可执行文件 并用它来取代原调用进程的数据段 代码段和堆栈段 在执行完之后 原调用进程的内容除了进程号外 其他全部被新的进程替换了 另外 这里的
  • zabbix自动发现和自动注册

    1 配置zabbix自动发现 1 gt 自动发现主要是希望通过发现网络中的主机 并自动把主机添加到监控中 并关联特定的模板 实现自动监控 例如在办公网络中 希望通过ZabbixAgent监控所有工作电脑 只需要把新安装的电脑开放防火墙100
  • DNS服务器的搭建

    DNS 域名系统 它用于TCP IP网路 它提供的服务是用来将主机名和域名转换为IP地址的工作 DNS常用术语 1 DNS服务器 提供域名解析服务的主机 2 DNS客户机 任何联网的需要查询主机域名信息的主机 3 正向解析 将域名称解析为I
  • JAVA多线程服务器,UI实现

    JAVA多线程服务器 UI实现 服务器选择端口启动服务 客户端填入服务器名和端口进行服务器连接 实现功能 多客户端的同时连接 客户端上线通知 点击send按钮或者敲击回车进行发送 消息发送时间显示 客户端与服务器实时通信 可同时发送多条消息
  • 运算放大器设计及应用参讨(三)

    1 请问运放上的 15V 电压不稳定是不是也影响输出波形 问 请问运放上的 15V 电压不稳定是不是也影响输出波形 答 1 电源电压的波动会影响到输出的 但是对于输出能影响到多少 运放中有个参数PSRR 可以体现出来 例如PSRR 80dB
  • 华硕z97不识别m2固态_固态盘M.2、SATA有这样的差别,难怪大家都选“它”

    M 2接口SSD 现在常见的固态硬盘都是M 2或者SATA3接口 那么他们之间的区别是什么呢 今天 小编就以问答的形式 给大家普及下M 2固态硬盘的相关知识 1 什么是M 2接口 M 2是硬盘的一种接口 主要优势就是比传统的SATA3 0接
  • 对随机变量的简单理解

    首先看下官方定义 随机变量是从样本空间投影到实数轴的一个广义的实值函数 对任意一个样本点w 存在唯一的实数X w 与之对应 我画了下图来解释这个定义 当我们需要研究事件发生的概率时 引入随机变量后 对事件概率的研究不再是重点 而是转化为对随
  • 变量名中的反义词

    add remove begin end create destroy insert delete first last get release increment decrement put get up down lock unlock
  • MySql.Data连接数据库mysql

    using MySql Data MySqlClient using MySql Data using System Data using System IO MySqlConnection con new MySqlConnection
  • SVN版本库的分支和Tag

    SVN的branch和tag管理都是通过copy实现的 它并没有独立的branche和tag概念 它仅仅是管理文件的历史 trunk branch tag对于SVN而言都是普通的文件夹 创建分支的svn命令 svn copy http sv
  • python中的linearregression_Python 线性回归(Linear Regression) - 到底什么是 regression?...

    背景 这个 linear Regression 中的 Regression 是什么意思 字面上 Regression 是衰退的意思 线性衰退 相信理解了这个词 对线性回归可能印象深刻些 Regression 到底是什么意思 搜了一番 原来是
  • mongodb的时间差 8小时

    存储在mongodb中的时间是标准时间UTC 0 00 而中国的时区是 8 00 所以实际的显示时间是加了八小时的 取出时间时 需要减去八小时
  • Android 内存泄露分析

    1 内存泄漏简介 内存泄漏是指内存空间使用完毕后无法被释放的现象 尽管Java有垃圾回收机制 GC 但是对于还保持着引用 逻辑上却已经不会再用到的对象 垃圾回收器不会回收它们 内存泄漏带来的危害 用户对单次的内存泄漏并没有什么感知 但当可用
  • 智能优化算法-战争策略算法War Strategy Optimization Algorithm(附Matlab代码)

    引言 战争策略算法War Strategy Optimization Algorithm是基于军队在战争中的战略运动 将战争策略建模为一个优化过程 每个士兵都动态地向最优值移动 该算法对两种流行的战争策略 进攻和防御策略进行建模 士兵在战场
  • VBA技术资料MF54:VBA_EXCEL实时获取鼠标位置

    分享成果 随喜正能量 若人散乱心 乃至以一花 供养于画像 渐见无数佛 所以发一幅释迦牟尼佛像 与同修善友一起每日在微博上供养 只要有供养之心 便可积累功德 以此回向 愿求者如愿苦者得乐 愿这世界吉祥安乐 愿每颗心充满善念 我给VBA的定义
  • 0.96寸OLED12864显示屏设计方案(原理图+PCB+BOM表+程序)

    一 简介 OLED 屏幕作为一种新型的显示技术 其自身可以发光 亮度 对比度高 功耗低 在当下备受追捧 而在我们正常的显示调整参数过程中 我们越来越多的使用这种屏幕 我们使用的一般是分辨率为 128 64 屏幕尺寸为 0 96 寸 由于其较
  • Python包中__init__.py文件的作用和用法

    在Python工程中 我们经常可以看到带有 init py 文件的目录 在PyCharm中 带有这个文件的目录被认为是Python的包目录 与目录的图标有不一样的显示 如下图所示 链接 dir example是一个空白目录 图标是个文件夹图
  • R.I.P,又一位程序员巨佬——左耳朵耗子陨落

    震惊 谣言吧 求辟谣 默哀 左耳朵耗子 在程序员这个群体里应该属于 GOAT 的存在了 虽然每个人心目中都有自己的 GOAT 但耗子叔的影响力可以说是有目共睹 我也是在技术群刷到这张图片的 相信大多数小伙伴和我一样 震惊 谣言吧 求辟谣 默
  • 用C#语言泛化单件模式

    用C 语言泛化单件模式 本人对于C 只能算是初学者 写此随笔 也只为和大家一起讨论 共同进步 我看到过一些用C 语言泛化单件 Singleton 的文章和代码 里面有个问题 即用new来创建对象 比如类似下面这段代码 if instance
  • 串口接受时有关接受标志位详解

    首先我们来看一下MDK对各位的描述 可以发现0 13位接受的是数据个数 填满相当于十进制的8191 那么既然0 13位数据量这么大 代码是如何实现对14 15位的修改呢 废话不多说 先上实现代码 原子哥编写 void USART1 IRQH