STM32之串口中断接收丢失数据

news/2024/5/17 9:40:03

五六年没搞STM32了,这个项目一切都挺顺利,万万没想到被串口接收中断恶心到了。遇到的问题很奇怪

 HAL_UART_Receive_IT(&huart1, &rx_buffer[rx_index], LCD_UART_LEN);

这个代码中 LCD_UART_LEN=1的时候,接收过来的数据,数据包的第一个字节总是会跑到rx_buffer的末尾,如下

当LCD_UART_LEN为其它值时,打印的看不出规律,有点乱,只有当LCD_UART_LEN=为数据包的大小时,打印出来没问题。

就这么一个万恶的破问题  搞了一整天,参考了CubeMX库中的示例代码,一行行对照代码,不行!又参考了正点原子和野火的代码,这两家的代码可以说没有最烂,只有更烂,完全坑害初学者。比如正点原子的,竟然在中断服务中整个while循环判断状态。。。

最后没办法,抱着侥幸的心里试了试ChatGPT,给出了下面的示例代码

#include "stm32f4xx_hal.h"#define BUFFER_SIZE 100uint8_t rx_buffer[BUFFER_SIZE];
uint8_t rx_index = 0;UART_HandleTypeDef huart;void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){rx_buffer[rx_index++] = huart->Instance->DR; // 读取接收到的数据并放入缓冲区if (rx_index >= BUFFER_SIZE){// 如果缓冲区已满,进行相应处理// 可以在这里进行数据处理或者清空缓冲区rx_index = 0; // 重置缓冲区索引}HAL_UART_Receive_IT(&huart, rx_buffer + rx_index, 1); // 继续接收下一个字节}
}int main(void)
{HAL_Init();__HAL_RCC_USART1_CLK_ENABLE();huart.Instance = USART1;huart.Init.BaudRate = 9600;huart.Init.WordLength = UART_WORDLENGTH_8B;huart.Init.StopBits = UART_STOPBITS_1;huart.Init.Parity = UART_PARITY_NONE;huart.Init.Mode = UART_MODE_TX_RX;huart.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart) != HAL_OK){// 初始化失败处理while (1);}HAL_UART_Receive_IT(&huart, rx_buffer, 1); // 启动中断接收while (1){// 主循环中可以进行其他操作}
}

最重要的一点就是读数据是直接寄存器读取的rx_buffer[rx_index++] = huart->Instance->DR;

或许这是HAL库的bug吧,我用的是STM32G0B0CET6,其它芯片的HAL库不清楚有没有这个问题。

就这么一个点 浪费了一整天。。。


http://www.mrgr.cn/p/05401478

相关文章

CogVLM/CogAgent环境搭建推理测试

​ 引子 对于多模态大语言模型,一直没有怎么接触。刚巧一朋友有问到这方面的问题,也就顺手调研下。智谱AI的东西一直以来,还是很不错的。ChatGLM的忠实fans,看到白嫖网站github上有他们开源的多模态CogVLM/CogAgent,那就顺手看看了。OK,让我们开始吧。 一、模型介绍 CogV…

使用input对电话号码实现隐藏显示

1、首先选择利用表格来呈现html结构<!-- html代码 --><table border="1px solid"><thead><tr><th>姓名</th><th>电话号码</th></tr></thead><tbody><tr><td align="center"&g…

科研新纪元已至:实验室场景可视化技术点亮科研之路

实验室场景可视化,通过先进的技术手段,将实验室内的设备、仪器、环境等以三维立体的形式呈现在人们眼前。这种技术的出现,彻底改变了传统实验室的呈现方式,让科研人员能够更加直观、全面地了解实验室的各个方面。在科技日新月异的今天,实验室作为科研创新的摇篮,正迎来一…

MATLAB中simulink中scope同时显示两个输入信号

在使用scope时,需要两个输入信号的设置方法 1.点开scope图标2 点击设置按钮, 然后弹出configuration properties:scope配置图,在Main选项下,在Number of input ports:1这里面更改数字,需要几个输入信号就更改几,此时这里更改为23 设置layout 选择自己喜欢的窗口显示排列…

C语言 | Leetcode C语言题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; double myPow(double x, int n){if(n 0 || x 1){return 1;}if(n < 0){return 1/(x*myPow(x,-(n1)));}if(n % 2 0){return myPow(x*x,n/2);}else{return x*myPow(x*x,(n - 1)/2);} }

记录些RAG-Fusion、Agent、NL2SQL的问题

RAG-Fusion RAG-Fusion 的实现原理 Query Duplication with a Twist&#xff1a;用 LLM 根据用户的 Query 生成几个相关的但不同的 Queries。Vector Search Unleashed&#xff1a;对原 Query 和生成的 Queries 都进行向量&#xff08;或者其他方式的&#xff09;搜索。Intell…

微信读书助手迎来史诗级增强

大家好,我前夕.最近,我分享了个人开发的微信读书网页插件,这个小项目意外收获了众多用户的喜爱. 这让我意识到技术作品能跨越专业界限,帮助到有需要的人.受此激励,我决定对插件进行全面重构与优化背景 20天前, 发布了一篇文章讲述我自己写的浏览器插件, 帮助自己在阅读微信读书…

python脚本获取当前浏览器客户端的公共ip以及其详细信息

python脚本获取当前客户端的公共ip以及其详细信息 import requests from flask import Flask, request, make_response, send_from_directory from datetime import datetime import asyncio from hypercorn.asyncio import serve from hypercorn.config import Config import …

shell命令jq用法详解

摘自:https://blog.csdn.net/weixin_44799217/article/details/1314933981、jq介绍 jq是Linux系统中把文本字符串格式化成json格式的工具。jq命令用于将JSON数据转换为更易读的格式并将其打印到 Linux 上的标准输出。jq命令是围绕过滤器构建的,过滤器用于从JSON文件中…

Android 音视频播放器 Demo(一)—— 视频解码与渲染

本篇作为 Android 音视频实战系列的第二篇文章&#xff0c;主要介绍视频解码与渲染过程。本系列文章目录如下&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff…

golang beego结合wire依赖注入及自动路由

1 安装wire 1.1 通过命令直接安装 go install github.com/google/wire/cmd/wirelatest 1.2 通过go get方式安装 go get github.com/google/wire/cmd/wire进入目录编译 cd C:\Users\leell\go\pkg\mod\github.com\google\wirev0.6.0\cmd\wire go build 然后将wire.exe移动到…

keytool,openssl的使用

写在前面 在生成公钥私钥&#xff0c;配置https时经常需要用到keytool&#xff0c;openssl工具&#xff0c;本文就一起看下其是如何使用的。 keytool是jdk自带的工具&#xff0c;不需要额外下载&#xff0c;但openssl需要额外下载 。 1&#xff1a;使用keytool生成jks私钥文件…

Linux Bridge和Tap关系详解

Bridge(桥)是Linux上用来做TCP/IP二层协议交换的设备,与现实世界中的交换机功能相似。Bridge设备实例可以和Linux上其他网络设备实例连接,既attach一个从设备,类似于在现实世界中的交换机和一个用户终端之间连接一根网线。当有数据到达时,Bridge会根据报文中的MAC信息进行…

SpringBoot的JSR303校验

关于JSR JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 关于 JSR-303 JSR-303 是JAVA EE 6…

C++笔记:C++中的重载

重载的概念 一.函数重载 代码演示例子&#xff1a; #include<iostream> using namespace std;//函数名相同&#xff0c;在是每个函数的参数不相同 void output(int x) {printf("output int : %d\n", x);return ; }void output(long long x) {printf("outp…

汽车制造业安全事故频发,如何才能安全进行设计图纸文件外发?

汽车制造业产业链长,关联度高,汽车制造上游行业主要为钢铁、化工等行业,下游主要为个人消 费、基建、客运和军事等。在汽车制造的整个生命周期中,企业与上下游供应商、合作商之间有频繁、密切的数据交换,企业需要将设计图纸等文件外发给外部合作商,同时也需要接收外部的反…

《ElementPlus 与 ElementUI 差异集合》el-dialog 显示属性有差异

ElementPlus 用属性 v-model ElementUI 用属性 visible 其实也是 Vue2/Vue3 的差异&#xff1a;v-model 指令在组件上的使用已经被重新设计&#xff0c;替换掉了 v-bind.sync

探索Jellyfin:支持Android的自由开源的媒体服务器平台

探索Jellyfin&#xff1a;支持Android的自由开源的媒体服务器平台 I. 简介 A. 什么是Jellyfin&#xff1f; Jellyfin是一个自由开源的媒体服务器平台&#xff0c;旨在让用户能够自主管理和流式传输他们的媒体内容。与许多闭源的商业媒体服务器解决方案不同&#xff0c;Jelly…

Mybatis二级缓存使用

一、应用场景例如首页数据加载很慢,但是首页相关数据变动很小。即可以使用二级缓存二、此处以springboot项目为例在yml配置文件新增   三、查询数据的类对象需要序列化 不然会报错 四、在对应的xml文件中加入</cache>开启二级缓存 五、最好的项目启动时加载一次该函数…

智能优化算法及 MATLAB 实现(书籍推荐)

智能优化算法及 MATLAB 实现&#xff08;书籍推荐&#xff09; 介绍前言目录第1章 粒子群优化算法原理及其MATLAB实现第2章 哈里斯鹰优化算法原理及其MATLAB实现第3章 沙丘猫群优化算法原理及其MATLAB实现第4章 鲸鱼优化算法原理及其MATLAB实现第5章 大猩猩部队优化算法原理及其…