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,避免使用全局变量报错。 1. HTML 引入第三方 JS 在你的 HTML 文件中,通过 <script> 标签引入一个本地第三方 JS 文件,例如: <script sr…...
android framework.jar 在应用中使用
在开发APP中,有时会使用系统提供的framework.jar 来替代 android.jar, 在gradle中配置如下: 放置framework.jar 依赖配置 3 优先级配置 gradle.projectsEvaluated {tasks.withType(JavaCompile) {Set<File> fileSet options.bootstrapClasspat…...
FFmpeg入门
在音视频处理领域,有一款神器级的工具横扫开发者圈,那就是 FFmpeg。它被誉为“音视频处理的瑞士军刀”,凭借强大的功能和开源的特性成为众多开发者和媒体从业者的首选。今天,我们就来聊聊 FFmpeg 的入门使用,带你轻松开…...
云平台一键部署【Video-Background-Removal】视频换背景,无任何限制,随意换
Video-Background-Removal 是一款革命性的视频背景替换工具,旨在让用户轻松实现视频背景的快速更换。无论你是专业创作者还是普通用户,这款软件都能让你在几秒钟内改变背景,完全消除限制,随心所欲,随时随地想换就换&am…...
量子计算:从薛定谔的猫到你的生活
文章背景 说到量子计算,不少人觉得它神秘又遥不可及。其实,它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”,这些听上去像科幻小说的概念,却为计算世界开辟了一片全新的天地。如果经典计算是“…...
51单片机——I2C-EEPROM
I2C:总线标准或通信协议 EEPROM:AT24C02芯片 开发板板载了1个EEPROM模块,可实现IIC通信 1、EEPROM模块电路(AT24C02) 芯片的SCL和SDA管脚是连接在单片机的P2.1和P2.0上 2、I2C介绍 I2C(Interÿ…...
R语言的语法糖
R语言的语法糖 引言 在编程语言中,所谓的“语法糖”是指那些使得程序员能够以更简洁、直观的方式书写代码的语法形式。R语言作为一种用于统计分析和数据可视化的编程语言,具有丰富的功能和灵活的语法。本文将深入探讨R语言中的语法糖,帮助读…...
【算法学习笔记】30:埃氏筛(Sieve of Eratosthenes)和线性筛(Linear Sieve)
测试题目:AcWing 868. 筛质数 埃氏筛(Sieve of Eratosthenes) 如果 i i i是素数,每次把 i i i的倍数都筛掉,存在重复筛选,时间复杂度 n ⋅ l o g ( l o g n ) n \cdot log(logn) n⋅log(logn)。 #includ…...
【AscendC】tiling方案设计不当引起的一个时隐时现的bug
在设计tiling方案时,通常会考虑到非对齐的场景,对输入数据进行补全操作从而使得非对齐场景也能正确的完成计算。但在某些算子的实现过程中,沿用上述操作却会造成数据的错误计算,且这种错误出现与否取决于随机生成的测试数据质量。…...
视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?
视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程,这一过程在现代数字媒体中扮演着至关重要的角色。众所周知,视频转码不仅仅是简单的格式转换,它涉及多个关键参数的改变,例如视频编码格式、比特率、分辨率以及帧率…...
工业视觉2-相机选型
工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结,具体如下: 一、按芯片类型 CCD相机:采用电荷耦合器件(CC…...
基于SpringBoot+Vue的健身房管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 随着现代生活节奏的加快,人们对健康的需求日益增强,健身房行业因此迎来了蓬勃的发展。然而,传统的健身房管理方式逐渐暴露出效率低下、会员信息管理混乱、课程安排不灵活等问题。为了解决这些…...
新手零基础入门:用快马ai生成win10系统openclaw安装图文指南代码
作为一个刚接触自动化测试的新手,我在Windows 10上安装OpenClaw时踩了不少坑。环境配置、依赖冲突、路径问题...每一步都可能让初学者抓狂。后来我发现用InsCode(快马)平台可以快速生成图文并茂的安装指南代码,把复杂流程拆解成可执行的步骤脚本…...
从90V到430V宽压输入,手把手教你用Mathcad设计一个12V/1A的DCM反激电源(附避坑指南)
从90V到430V宽压输入:基于Mathcad的12V/1A DCM反激电源设计实战 面对工业设备、新能源系统等场景中波动剧烈的输入电压,设计一款稳定可靠的隔离电源始终是硬件工程师的挑战。本文将带您从零开始,用Mathcad工具完整实现90-430V宽压输入、12V/1…...
Mac环境OpenClaw深度配置:Qwen3-14B镜像多模型切换技巧
Mac环境OpenClaw深度配置:Qwen3-14B镜像多模型切换技巧 1. 为什么需要多模型切换? 去年冬天,当我第一次尝试用OpenClaw自动化处理团队周报时,遇到了一个典型问题:同样的模型配置在处理"数据分析"和"文…...
黑丝空姐-造相Z-Turbo入门:Git版本控制下的模型项目管理
黑丝空姐-造相Z-Turbo入门:Git版本控制下的模型项目管理 你是不是也遇到过这种情况?团队里几个人一起调一个AI模型,今天你改了下提示词,明天他更新了模型参数,结果谁也不知道哪个版本的效果最好。或者,辛辛…...
Unity托管堆内存优化实战:如何避免频繁GC引发的性能卡顿
1. 为什么你的Unity游戏会卡顿?GC是罪魁祸首 刚做完的Unity游戏明明跑得好好的,一到真机上就出现迷之卡顿?特别是场景切换或者特效爆发时,画面突然卡住0.5秒?这很可能就是垃圾回收(GC)在搞鬼。…...
应对复杂实战场景:基于快马平台生成动态网页爬虫完整解决方案
今天想和大家分享一个实战中的Python爬虫项目,主要解决动态渲染社交媒体网站的数据抓取问题。这类网站通常采用JavaScript动态加载内容,传统的requests库很难直接获取数据,需要借助浏览器自动化工具。 项目背景与难点分析 动态网页爬虫的核…...
seL4通知机制完全指南:高效异步事件处理的终极解决方案
seL4通知机制完全指南:高效异步事件处理的终极解决方案 【免费下载链接】seL4 The seL4 microkernel 项目地址: https://gitcode.com/gh_mirrors/se/seL4 seL4微内核的通知机制是构建高可靠实时系统的核心组件之一,它提供了一种高效、安全的异步事…...
3个让单机游戏体验翻倍的开源工具:OpenSpeedy完全指南
3个让单机游戏体验翻倍的开源工具:OpenSpeedy完全指南 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 你是否曾因游戏节奏过慢而失去耐心?或者在重复性…...
在RK3588上搞定XDMA AXI-Stream回环测试:从Verilog到Rust的完整流程与避坑指南
RK3588平台XDMA AXI-Stream全链路开发实战:从FPGA设计到Rust测试的工程化实现 当我们需要在嵌入式系统中实现高速数据交换时,PCIeAXI-Stream的组合无疑是黄金搭档。RK3588作为一款高性能处理器,配合FPGA的灵活可编程特性,能够构建…...
5分钟快速上手WireMock UI:可视化Mock服务管理利器
5分钟快速上手WireMock UI:可视化Mock服务管理利器 【免费下载链接】wiremock-ui An unofficial UI for WireMock 项目地址: https://gitcode.com/gh_mirrors/wi/wiremock-ui WireMock UI 是一个为WireMock提供的可视化用户界面,让你能够通过图形…...
