当前位置: 首页 > news >正文

STM32和国民技术(N32)单片机串口中断接收数据及数据解析

一、串口配置

根据单片机不同,串口IO口配置也不同,像STM32单片机,RX脚可以配置为复用输出,也可以配置为浮空输入模式。但是国民技术单片机(N32)的RX是不能配置为复用输出模式的,这样是收不到数据的,只能配置为浮空输入模式。其他的单片机情况也不一样。使用时候需要注意。

STM32单片机串口接收中断配置代码如下:

 void uart_init(u32 bound)
{GPIO_InitTypeDef GPIO_Initstructure;USART_InitTypeDef USART_Initstructure;NVIC_InitTypeDef NVIC_Initstrcuture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE );RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA ,ENABLE );GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9;GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF;GPIO_Initstructure.GPIO_OType = GPIO_OType_PP;GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Initstructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA,&GPIO_Initstructure);GPIO_Initstructure.GPIO_Pin = GPIO_Pin_10;GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF;GPIO_Initstructure.GPIO_OType = GPIO_OType_PP;GPIO_Initstructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Initstructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA,&GPIO_Initstructure);USART_Initstructure.USART_BaudRate = bound;USART_Initstructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Initstructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Initstructure.USART_Parity = USART_Parity_No;USART_Initstructure.USART_StopBits = USART_StopBits_1;USART_Initstructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART1,&USART_Initstructure);NVIC_Initstrcuture.NVIC_IRQChannel = USART1_IRQn;NVIC_Initstrcuture.NVIC_IRQChannelPreemptionPriority=3;NVIC_Initstrcuture.NVIC_IRQChannelSubPriority =3;		NVIC_Initstrcuture.NVIC_IRQChannelCmd = ENABLE;		NVIC_Init(&NVIC_Initstrcuture);	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	//串口接收中断//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);	//串口空闲中断USART_Cmd(USART1, ENABLE);
}

N32单片机串口接收中断配置如下:

   void Uart_Init(u32 band){RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA|RCC_APB2_PERIPH_AFIO,ENABLE);RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_USART1,ENABLE);GPIO_InitType GPIO_InitStructure;USART_InitType USART_InitStructure;NVIC_InitType NVIC_InitStructure;GPIO_InitStructure.Pin  = GPIO_PIN_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitPeripheral(UART_GPIO_INIT, &GPIO_InitStructure);GPIO_InitStructure.Pin = GPIO_PIN_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitPeripheral(USART1, &GPIO_InitStructure);USART_InitStructure.BaudRate = band;USART_InitStructure.Parity = USART_PE_NO;USART_InitStructure.StopBits = USART_STPB_1;USART_InitStructure.WordLength = USART_WL_8B;USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;USART_InitStructure.Mode = USART_MODE_RX | USART_MODE_TX;USART_Init(USART1, &USART_InitStructure);NVIC_InitStructure.NVIC_IRQChannel                   = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 2;NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;NVIC_Init(&NVIC_InitStructure);USART_ConfigInt(USART1, USART_INT_RXDNE, ENABLE);USART_Enable(USART1, ENABLE);}

这个中断就是串口缓冲区有数据时候就会产生中断,也就是接收到一个字节就中断一次。如果是那种数据量很大且需要持续发的情况可以选择使用DMA结合串口空闲中断使用比较方便。串口空闲中断就是发完一整包数据才进行中断。

二、串口中断解析

以0x12 ,0x13 0x0a 0x01 0x02 0x03,0x04,0x05,0xab,0xac这帧简单数据为例子讲解。
前两个字节为头和功能码
第三个字节为总长度
最后两个字节为尾
没有校验

volatile u32 Buff_Num; //全局变量
u32 Buff_Len;
//正取写法
void USART1_IRQHandler(void)
{if(USART_GetIntStatus(USART1,USART_INT_RXDNE)){Rece_Buff[Buff_Num++] =USART_ReceiveData(USART1);USART_ClrIntPendingBit(USART1,USART_INT_RXDNE); //先取数据后清标准正确写法if(Buff_Num ==1)       {if(Rece_Buff[0]!=0xfe){Buff_Num=0;}}else if(Buff_Num ==2){if(Rece_Buff[1]!=0x54){Buff_Num=0;}}  //逐一字节对齐正确写法else if(Buff_Num ==3){Buff_Len = Rece_Buff[2];}else{if(Buff_Num==Buff_Len){ Buff_Num=0;if(Rece_Buff[Buff_Len-2]==0xab&&Rece_Buff[Buff_Len-1]==0xac){//取出数据使用}else{//尾不对}}}}
}//错误写法
void USART1_IRQHandler(void)
{if(USART_GetIntStatus(USART1,USART_INT_RXDNE)){ USART_ClrIntPendingBit(USART1,USART_INT_RXDNE);Rece_Buff[Buff_Num++] =USART_ReceiveData(USART1); //先清标志后取数据错误写法if(Buff_Num ==2)       {if(Rece_Buff[0]!=0xfe&&Rece_Buff[1]!=0x54){Buff_Num=0;}}  //不逐一字节进行对齐错误写法else if(Buff_Num ==3){Buff_Len = Rece_Buff[2];}else{if(Buff_Num==Buff_Len){ Buff_Num=0;if(Rece_Buff[Buff_Len-2]==0xab&&Rece_Buff[Buff_Len-1]==0xac){//取出数据使用}else{//尾不对}}}}
}

串口接收中断和数据解析需要注意两个问题:

1.应该先取数据后清标志。

如果先清标志位,在取数据。会出现,数据还没有取出来就告诉单片机我数据已经取出来,然后下一个数据过来了,而寄存器上一个数据还在,没有读出去无法接收下一个数据就会导致触发溢出中断。如果没有清除溢出中断标志位,会一直触发溢出中断卡在中断出不去。
这就好比,碗里成满饭,还没开始吃,就告诉盛饭的人你的碗空了,那下一碗饭过来,碗装不下就会溢出。但是先取数据再清标志位就是碗里有饭,先吃完饭再告诉盛饭的人碗空了,那下一碗饭来才能正常装。

2.数据从头对齐时候必须一个一个字节进行对齐

我平时习惯那种错误写法,头两个字节一起去对,这样只有没有其他数据,或者刚好数据长度是对的时候才能对齐。有其他数据包或者长度不对的时候,除了第一包可以对齐,后面永远对不齐。就不能正常接收数据包了。

三,需要接收多包数据并解析

只需要在判断头那里或上其他的头就可以。
例如:
1 . 接收0xa1 0xa2为头的数据包。
2 . 接收0xb1 0xb2为头的数据包。
3 . 接收0xc1 0xc2为头的数据包。

//中断接收多包数据
void USART1_IRQHandler(void)
{if(USART_GetIntStatus(USART1,USART_INT_RXDNE)){Rece_Buff[Buff_Num++] =USART_ReceiveData(USART1);USART_ClrIntPendingBit(USART1,USART_INT_RXDNE); //先取数据后清标准正确写法if(Buff_Num ==1)       {if(Rece_Buff[0]!=0xa1||Rece_Buff[0]!=0xb1||Rece_Buff[0]!=0xc1){Buff_Num=0;}}else if(Buff_Num ==2){if(Rece_Buff[1]!=0xa2||Rece_Buff[1]!=0xb2||Rece_Buff[1]!=0xc2){Buff_Num=0;}}  //正确写法else if(Buff_Num ==3){Buff_Len = Rece_Buff[2];  //各包长度不一样这里会取}else{if(Buff_Num==Buff_Len){ Buff_Num=0;if(Rece_Buff[Buff_Len-2]==0xab&&Rece_Buff[Buff_Len-1]==0xac){//取出数据使用}else{//尾不对}}}}
}

相关文章:

STM32和国民技术(N32)单片机串口中断接收数据及数据解析

一、串口配置 根据单片机不同,串口IO口配置也不同,像STM32单片机,RX脚可以配置为复用输出,也可以配置为浮空输入模式。但是国民技术单片机(N32)的RX是不能配置为复用输出模式的,这样是收不到数…...

【人工智能】大语言模型的微调:让模型更贴近你的业务需求

大语言模型的微调:让模型更贴近你的业务需求 随着大语言模型(LLM, Large Language Model)如 GPT-4、BERT 和 T5 等的广泛应用,模型的微调(Fine-tuning)技术成为实现领域专属任务的重要手段。通过微调&…...

大语言模型的稀疏性:提升效率与性能的新方向

大语言模型的稀疏性:提升效率与性能的新方向 大语言模型(LLM, Large Language Model)随着参数规模的不断扩大,其性能得到了显著提升,但也带来了巨大的计算和存储开销。稀疏性(Sparsity)作为一种…...

Linux Bridge与Open vSwitch的工作原理及协作

在虚拟化和云计算环境中,Linux Bridge和Open vSwitch(OVS)都是用于构建虚拟网络的关键组件。它们提供了二层交换功能,并且能够将虚拟机或容器连接到物理网络中。然而,两者在实现细节和技术特性上有所不同,下…...

async++源码阅读——task模块

1、task_base.h 本人将自己的理解以注释的形式添加的代码中,方便需要的时候重新复习。该文件中用到的一些技术: 该文件中的类并没有使用virtual,而是自定义了需函数表,但是并没有放到每个对象的开始位置,而是通过指针…...

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(五)

文章目录 一、学生管理模块功能实现1、添加学生功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、学生管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码…...

EF Core一对一和多对多

目录 EF Core一对一 关系属性 关系配置 使用 EF Core多对多 关系属性 关系配置 使用 EF Core一对一 关系属性 必须显式的在其中一个实体类中声明一个外键属性,可以在Order建立Delivery,也可以在Delivery建立OrderId class Order {public long…...

记一次sealos部署k8s集群之delete了第一台master如何恢复

记一次sealos部署k8s集群之delete了第一台master如何恢复 一、背景描述 使用sealos部署了一套K8S集群 master信息:172.27.100.1、172.27.100.2、172.27.100.3 node信息:172.27.100.4、172.27.100.5 sealos安装在172.27.100.1节点,根目录下/root/.sealos/文件还在! [root…...

vue3+vite+ts集成第三方js

npm run dev可以正常运行和测试。但是npm run build会报错。 要实现引入静态js&#xff0c;避免使用全局变量报错。 1. HTML 引入第三方 JS 在你的 HTML 文件中&#xff0c;通过 <script> 标签引入一个本地第三方 JS 文件&#xff0c;例如&#xff1a; <script sr…...

android framework.jar 在应用中使用

在开发APP中&#xff0c;有时会使用系统提供的framework.jar 来替代 android.jar, 在gradle中配置如下&#xff1a; 放置framework.jar 依赖配置 3 优先级配置 gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspat…...

FFmpeg入门

在音视频处理领域&#xff0c;有一款神器级的工具横扫开发者圈&#xff0c;那就是 FFmpeg。它被誉为“音视频处理的瑞士军刀”&#xff0c;凭借强大的功能和开源的特性成为众多开发者和媒体从业者的首选。今天&#xff0c;我们就来聊聊 FFmpeg 的入门使用&#xff0c;带你轻松开…...

云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换

Video-Background-Removal 是一款革命性的视频背景替换工具&#xff0c;旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户&#xff0c;这款软件都能让你在几秒钟内改变背景&#xff0c;完全消除限制&#xff0c;随心所欲&#xff0c;随时随地想换就换&am…...

量子计算:从薛定谔的猫到你的生活

文章背景 说到量子计算&#xff0c;不少人觉得它神秘又遥不可及。其实&#xff0c;它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”&#xff0c;这些听上去像科幻小说的概念&#xff0c;却为计算世界开辟了一片全新的天地。如果经典计算是“…...

51单片机——I2C-EEPROM

I2C&#xff1a;总线标准或通信协议 EEPROM&#xff1a;AT24C02芯片 开发板板载了1个EEPROM模块&#xff0c;可实现IIC通信 1、EEPROM模块电路&#xff08;AT24C02&#xff09; 芯片的SCL和SDA管脚是连接在单片机的P2.1和P2.0上 2、I2C介绍 I2C&#xff08;Inter&#xff…...

R语言的语法糖

R语言的语法糖 引言 在编程语言中&#xff0c;所谓的“语法糖”是指那些使得程序员能够以更简洁、直观的方式书写代码的语法形式。R语言作为一种用于统计分析和数据可视化的编程语言&#xff0c;具有丰富的功能和灵活的语法。本文将深入探讨R语言中的语法糖&#xff0c;帮助读…...

【算法学习笔记】30:埃氏筛(Sieve of Eratosthenes)和线性筛(Linear Sieve)

测试题目&#xff1a;AcWing 868. 筛质数 埃氏筛&#xff08;Sieve of Eratosthenes&#xff09; 如果 i i i是素数&#xff0c;每次把 i i i的倍数都筛掉&#xff0c;存在重复筛选&#xff0c;时间复杂度 n ⋅ l o g ( l o g n ) n \cdot log(logn) n⋅log(logn)。 #includ…...

【AscendC】tiling方案设计不当引起的一个时隐时现的bug

在设计tiling方案时&#xff0c;通常会考虑到非对齐的场景&#xff0c;对输入数据进行补全操作从而使得非对齐场景也能正确的完成计算。但在某些算子的实现过程中&#xff0c;沿用上述操作却会造成数据的错误计算&#xff0c;且这种错误出现与否取决于随机生成的测试数据质量。…...

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…...

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…...

基于SpringBoot+Vue的健身房管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着现代生活节奏的加快&#xff0c;人们对健康的需求日益增强&#xff0c;健身房行业因此迎来了蓬勃的发展。然而&#xff0c;传统的健身房管理方式逐渐暴露出效率低下、会员信息管理混乱、课程安排不灵活等问题。为了解决这些…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】

1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

零基础在实践中学习网络安全-皮卡丘靶场(第十一期-目录遍历模块)

经过前面几期的内容我们学习了很多网络安全的知识&#xff0c;而这期内容就涉及到了前面的第六期-RCE模块&#xff0c;第七期-File inclusion模块&#xff0c;第八期-Unsafe Filedownload模块。 什么是"遍历"呢&#xff1a;对学过一些开发语言的朋友来说应该知道&…...

生产管理系统开发:专业软件开发公司的实践与思考

生产管理系统开发的关键点 在当前制造业智能化升级的转型背景下&#xff0c;生产管理系统开发正逐步成为企业优化生产流程的重要技术手段。不同行业、不同规模的企业在推进生产管理数字化转型过程中&#xff0c;面临的挑战存在显著差异。本文结合具体实践案例&#xff0c;分析…...