STM32【复习串口】

2023-11-17

 串口复习加深理解笔记
杂谈

USART_FLAG_TXE发送缓冲区空标志:说明可以往数据寄存器写入数据了,但并不代码数据发送完成了。

USART_FLAG_TC发送完成标志:这个才是代表USART在缓冲区的数据发送完成了,即从机接收到了数据。

笔记的记录区 

串口发送函数的配套使用

          ///这个timeout要给够时间_否则发不完
          HAL_UART_Transmit(&huart1,RX_Buffer,LEN_DATA,1000);
          ///等待发送完成
          while (__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);

串口接收不定长的方式和思考方式 

//
// Created by o.o on 2022/3/26.
//

#ifndef FX_MY_UART_H
#define FX_MY_UART_H

#include "main.h"


///定长
#define LEN_DATA 200

///对是否使能,减少多余的编码量
#define EN_USART_RX 1

///接收缓存
extern uint8_t RX_Buffer[LEN_DATA];

///模拟寄存器,用于检测状态
extern uint16_t RxState_register;

extern uint32_t timeout;

///暂存每次次串口接收到的东西
#define RXBUFFERSIZE 1
extern uint8_t aRxBuffer[RXBUFFERSIZE];

///bit16 用于是否ready——read
///bit15 用于是否接收到0x0d
///bit1-14用于记录有效长度 16,383 个 byte 于是要乘8






#endif //FX_MY_UART_H


主要思想为设置一个自己的寄存器,通过这个寄存器标记位作为时序的逻辑

//
// Created by o.o on 2022/3/26.
//

#include "head/my_uart.h"
#include "usart.h"

///bit16 0x8000
///bit15 0x4000
///bit1-14 0x7FFF

uint16_t RxState_register = 0;///初始化寄存器
uint8_t aRxBuffer[RXBUFFERSIZE];///实际开辟缓存
uint8_t RX_Buffer[LEN_DATA];///实际开辟存储

///如果已经接收到了回车就置为1,如果接收到的是换行符0a则不置1
///使用佳佳++进行state的增加
///取出bit1-14,自动表示成10进制,变成索引,写入数据
///0 - 0 1 - 1 10 - 2存在相互对应

///0x0d回车
///0x0a换行符

///回车后应该紧接着的是换行符

///这个是接收每个字节都会进入的一个函数
///典型的三分法
///是否重新开始收集,其实取决于寄存器是否为0
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == huart1.Instance)///对应的串口号
    {
        if ((RxState_register & 0x8000) == 0)///bit16 != 1
        {
            if ((RxState_register & 0x4000))///bit15 =1接收到换行符
            {
                if (aRxBuffer[0] != 0x0a)RxState_register = 0;///与上方解释不对等-重新接收
                else RxState_register |= 0x8000;///写上完成接收标志
            }
            else
            {
                if (aRxBuffer[0] == 0x0d)RxState_register |= 0x4000;
                ///除了换行符和回车,就是正常数据了
                else{
                    RX_Buffer[RxState_register & 0X3FFF] = aRxBuffer[0];
                    RxState_register++; ///增加那个啥东西
                    ///因为此时的15/16位不存在东西,所以数字就是真实存入的东西
                    ///超出了存储范围
                    if (RxState_register > (LEN_DATA-1)) RxState_register = 0;
                }
            }
        }
    }
}

上面就是处理逻辑的位置了,因为在串口初始化的时候就开启了那个串口接收中断

 下面是对中断函数的一个处理,加入了timeout的一个轮询,达到以最短时间完成任务的标准

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    uint32_t timeout = 0;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1); ///公用的处理函数
  /* USER CODE BEGIN USART1_IRQn 1 */
    ///stm32中常用的是一直轮询,当状态达到后,马上进行退出,这样的话能做到尽可能小的时间完善紧凑运行
    ///一般以hal 库中的 max delay作为延时底线
    while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY)///等待就绪
    {
        timeout++;
        if(timeout > HAL_MAX_DELAY)break;
    }
    timeout = 0;
    ///并不会重复打开,而是会等,当不是ok的时候就等
    ///当称为ok的时候就会接收
    while(HAL_UART_Receive_IT(&huart1,(uint8_t*)aRxBuffer,RXBUFFERSIZE) != HAL_OK)
    {
        timeout++;
        if (timeout > HAL_MAX_DELAY)break;
    }


  /* USER CODE END USART1_IRQn 1 */
}

并且不断轮询HAL_UART_Receive_IT

如果是完成了,就会开启下一轮的中断,如果未完成,就会返回不ok

如果是达到了timeout的条件,最好就是重置一下自己定义的寄存器,并且开启一个全新的中断,否则就会处于假死

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

STM32【复习串口】 的相关文章

  • windows下安装使用git-lfs克隆大文件

    下载安装git lfs工具 首先去git lfs这里 下载相应平台的工具 我下载的windows版本 非安装版本 直接配置到系统环境变量里 执行以下命令验证是否成功 git lfs install 克隆数据集 这样自动会下载里边的大文件 g
  • 在vivado中使用tcl脚本(UG894)

    本文源自UG894 主要介绍如何在vivado中使用tcl脚本 1 vivado中如何获取tcl help vivado中任何自带的命令都可以通过 help 获取帮助信息 也可以直接输入 help 取得vivado命令合集 并通过 help

随机推荐

  • News Distribution(Codeforces 1167C) (并查集简单应用)

    并查集查询时间复杂度是O 1 合并时间复杂度才是O n 题意 n 人数 m 组数 m行 先输入k 表示这组有k个人 下面是k个人的编号 同组可以传递信息 问当第i个人是信息源时 有几个人知道信息 AC代码 include
  • 排序算法6-归并排序

    1 什么是归并排序 归并排序是建立在归并操作上的一种有效的排序算法 该算法是采用分治法 Divide and Conquer 的一个非常典型的应用 将已有序的子 序列合并 得到完全有序的序列 即先使每个子序列有序 再使子序列段间有序 若将两
  • 电路端接电阻与信号完整性

    信号沿着传输线传播时 每时每刻阻抗都可能发生变化 例如 PCB走线的宽度或者厚度发生变化 PCB过孔 PCB转角 PCB上的电阻 电容 电感 接插件和器件引脚都会产生阻抗变化 若走线的瞬时阻抗 只和传输线的横截面积和材质特性有关 发生变化
  • keil使用arm_math文件报错

    引入该文件后编译报错 application arm math h 306 error 35 error directive Define according the used Cortex cor 添加如下全局宏定义 USE HAL DR
  • 如何将任意数据保存到以太坊区块链?

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 虽然有北大博士讲 95 的区块链项目都没有前途 但我们知道区块链还是有它的优势 比如数据的不可篡改性对于版权保护有相当大的意义 而地址的匿名性则有其他潜在的用途 那么 如何
  • TensorFlow、PyTorch 和 Keras

    1 可用的 RNN 类型 在寻找 NLP 问题的深度学习解决方案时 循环神经网络 RNN 是开发人员最流行的首选架构 因此 从这个角度来比较框架是有意义的 所有正在考虑的框架都具有允许我们创建简单 RNN及其更进化的变体的模块 门控循环单元
  • V4l2框架基础知识(二)

    V4L2对uvc USB video class 免驱usb设备的编程框架 主要用于采集USB摄像头 采集方式 打开视频设备 设置视频设备的属性 缩放 裁剪等 在linux编程中直接使用ioctl 函数对设备I O通道进行管理 V4L2操作
  • 一文看懂PPP协议——PPP协议简介

    今天给大家介绍一下PPP协议的相关内容 文章浅显易懂 特别适合0基础同学 本文主将主要从PPP概述 PPP链路建立过程和PPP认证三个角度对PPP协议进行讲解 一 PPP概述 PPP point to point协议 即点对点协议 是数据链
  • unity获取用户鼠标与键盘操作

    Unity鼠标键盘输入 代码写在Update 函数中 屏幕坐标的原点在屏幕的左下角 1 通过Input API 获得鼠标的操作信息 1 获得鼠标的坐标位置 Input mousePosition 2 检测鼠标按下 Input GetMous
  • oracle如何去列的重复,oracle重复列只显示一次的实现

    CREATE TABLE test ob id VARCHAR 32 ob name VARCHAR 32 INSERT INTO test VALUES A001 A001 a INSERT INTO test VALUES A001 A
  • YOLOE,2022年新版YOLO解读

    前言 这是2022年第一个关于YOLO的改版 该版本由百度提出 称之为YOLOE 是目前各项指标sota的工业目检测器 性能sota且部署相对友好 该检测器的设计机制包括 Anchor free无锚盒机制 可扩展的backbone和neck
  • Spring的工作原理(二)IOC-DI

    目录 Spring的工作原理 二 IOC DI 一 什么是IOC 什么是DI 1 1 IOC Inversion of Control 控制反转 1 2 DI Dependency Injection 依赖注入 二 IOC控制反转基础知识
  • 【Python】ChineseCalendar包简介

    ChineseCalendar 是一个 Python 包 用于获取中国传统日历信息 这个包提供了中国农历 二十四节气 传统节日 黄历等信息 你可以使用以下命令来安装这个包 pip install ChineseCalendar 安装完成后
  • iOS开发 将html加载到页面上

    记得要引入头文件 import WebKit WebKit h weakself myWebView WKWebView alloc initWithFrame CGRectMake 0 206 weakself view com widt
  • stm32入门自学笔记

    一 二极管 二极管是一种由半导体材料制成的一种具有单向导电性能的电子元器件 二极管就是由一个由 P 型半导体和 N 型半导体形成的 PN 结加上相应的电极引线及管壳封装而成的 NPN和PNP型三极管的作用 1 NPN三极管 基极加高电压 集
  • PRBS笔记

    1 概述 PRBS 伪随机二进制序列 也称为伪随机码 通常被用来测试高速信号的信号质量 伪随机 也说明了该码流并不是真正的随机 而是具有特性属性 码流由 多项式 决定 具有重复周期 PRBS具有多种阶数 如PRBS7 PRBS15 PRBS
  • reify:rxjs: timing reifyNode:node_modules/@vue/cli/node_modules——————npm run dev报错-npm初始化错误

    金钱不够 全靠技术 创建vue3的问题总结 reify rxjs timing reifyNode node modules vue cli node modules卡死不动 npm run dev报错 全局安装webpack 总结 rei
  • ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your

    以下是解决问题的过程 没整理 root localhost flush privileges bash flush 未找到命令 root localhost mysql uroot p Enter password Welcome to t
  • Java 获取季度开始时间结束时间,获取日期所在月份,获取所在季度

    根据季度数获取季度的开始时间结束时间 public static Map
  • STM32【复习串口】

    串口复习加深理解笔记 杂谈 USART FLAG TXE发送缓冲区空标志 说明可以往数据寄存器写入数据了 但并不代码数据发送完成了 USART FLAG TC发送完成标志 这个才是代表USART在缓冲区的数据发送完成了 即从机接收到了数据