三种串口接收不定长数据方法详解

发布者:SereneMeadow最新更新时间:2024-07-08 来源: elecfans关键字:串口  不定长数据  STM32 手机看文章 扫描二维码
随时随地手机看文章

方法1:串口接受数据,定时器来判断超时是否接受数据完成。

方法2:DMA接受+IDLE中断

实现思路:采用STM32F103的串口1,并配置成空闲中断IDLE模式且使能DMA接收,并同时设置接收缓冲区和初始化DMA。那么初始化完成之后,当外部给单片机发送数据的时候,假设这帧数据长度是200个字节,那么在单片机接收到一个字节的时候并不会产生串口中断,而是DMA在后台把数据默默地搬运到你指定的缓冲区里面。当整帧数据发送完毕之后串口才会产生一次中断,此时可以利用DMA_GetCurrDataCounter();函数计算出本次的数据接受长度,从而进行数据处理。


应用对象:适用于各种串口相关的通信协议,如:MODBUS,PPI ;还有类似于GPS数据接收解析,串口WIFI的数据接收等,都是很好的应用对象。


关键代码分析:

void uart_init(u32 bound);

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx);

#endif

usart.C

//初始化IO 串口1

//bound:波特率

void uart_init(u32 bound)

{

//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

DMA_InitTypeDef DMA_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE); //使能USART1,GPIOA时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

USART_DeInit(USART1); //复位串口1

//USART1_TX PA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

//USART1_RX PA.10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

//USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;//无硬件数据流控制

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启空闲中断

USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); //使能串口1 DMA接收

USART_Cmd(USART1, ENABLE); //使能串口

//相应的DMA配置

DMA_DeInit(DMA1_Channel5); //将DMA的通道5寄存器重设为缺省值 串口1对应的是DMA通道5

DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR; //DMA外设usart基地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)DMA_Rece_Buf; //DMA内存基地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //数据传输方向,从外设读取发送到内存

DMA_InitStructure.DMA_BufferSize = DMA_Rec_Len; //DMA通道的DMA缓存的大小

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输

DMA_Init(DMA1_Channel5, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道

DMA_Cmd(DMA1_Channel5, ENABLE); //正式驱动DMA传输

}

//重新恢复DMA指针

void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx)

{

DMA_Cmd(DMA_CHx, DISABLE ); //关闭USART1 TX DMA1所指示的通道

DMA_SetCurrDataCounter(DMA_CHx,DMA_Rec_Len);//DMA通道的DMA缓存的大小

DMA_Cmd(DMA_CHx, ENABLE); //打开USART1 TX DMA1所指示的通道

}

//发送len个字节

//buf:发送区首地址

//len:发送的字节数

void Usart1_Send(u8 *buf,u8 len)


关键字:串口  不定长数据  STM32 引用地址:三种串口接收不定长数据方法详解

上一篇:对基于NUC472开发板的机智云功能板进行编程
下一篇:对寄存器操作方法的经验和其总结

推荐阅读最新更新时间:2026-03-20 12:00

vofa+ : 优雅のSTM32串口调试
0、前言 最近工作和电机的学习都要频繁打印数据来调试,但用过keil自带的那debug的都懂啊,用来看看寄存器和打断点就还行,数据监看就完全是顶级折磨,将近半秒钟才刷新一次,纯纯看个乐了。单纯监看数据的话,用串口无疑是更好的选择,比如xcom和sscom,常用的115200波特率就足以把数据闪电般打印出来。 虽然速度的问题解决了,但是看到这无穷无尽的数据长龙宛如看到了我的人生走马灯.....想要在其中找到某几个出问题的数据更无疑是大海捞针。但今天,一切都好起来了,因为一个维新派串口工具改变了一切。 1、工具介绍 本次的主角:vofa+,非常简单的一个串口工具,常见的串口功能都有,但既然它出现在了文章里就证明它没那么简单,是的,
[单片机]
STM32串口通信详解与实践
引言 在嵌入式系统开发中,串口通信是最基础且重要的通信方式之一。无论是设备调试、模块对接还是远程通信,串口都扮演着关键角色。本文将从通信协议原理出发,结合STM32F4系列MCU,深入讲解串口通信的硬件实现和软件配置,并通过实战案例展示其应用。 一、串口通信协议深度解析 1.1 串口通信核心概念 串行接口(Serial Port)采用逐位顺序传输方式,其优势在于: 硬件成本低(仅需2根信号线) 传输距离远(RS485可达千米级) 抗干扰能力强 协议简单易实现 常见串口类型对比: 类型 电平标准 传输距离 通信方式 TTL 0-3.3V/5V 3m 全双工 RS232 ±3-15V 15m 全双工 RS485
[单片机]
STM32串口接收环形缓存区实现_1
在我们使用STM32串口进行发送连续大量的数据包的时候,如果接收程序处理不及时,可能导致数据包错位,为了解决这种问题,我们通常的处理是在串口中断状态机中,待事件执行完成后添加接收标志位判断,这里大家可以观看up江协科技的视频【STM32入门教程-2023版 细致讲解 中文字幕】 网页链接 这里对该方法不进行过多赘述,本期所引入的是另一种处理串口接收数据的数量太大的,亦或者当数据接收太快时的解决办法,串口环形缓存区(Ring Buffer) ①这里,我们首先要介绍一些数据结构中的前置知识 按照分类,常见的队列结构可分为两种:普通队列和循环队列 在计算机中,每个信息都是存储在存储单元中的,譬如,上图的一些小方格就是一个个存储单
[单片机]
<font color='red'>STM32</font>的<font color='red'>串口</font>接收环形缓存区实现_1
STM32串口基本配置
记得刚开始接触STM32时,第一个用到的就是串口功能,当时还是刚毕业的小菜鸟(虽然现在依然是),一点一点地啃官方手册,芯片手册,调通第一个程序时心里那叫一个激动,因为一直以来自己都是一个不太优秀的笨学生,老师同学包括家人都不太看好,干什么事情都笨笨的,庆幸自己遇到了一个好师傅,一步一步把我带进这行,我格外珍惜。经常有人问我为什么对待刚毕业的学生那么有耐心,我的回答是:"因为我有过相同的经历,我知道那种战战兢兢又要厚着脸皮问别人的滋味有多不好受。”(也不知道为啥做点经验总结,还有这么多的感慨,也是醉了~)
[单片机]
STM32与树莓派串口通信实现(简易教程,无需安装micro-ROS版)
零、预设: 本次实验是为了给ROS2模块小车的通信打基础,我们选择stm32f407和树莓派4B进行电机控制和数据处理,二者之间需要进行串口通信,找到一个比较方便的方法(无需安装micro-ROS) 一、基本思路: 和普通的串口通信其实都差不多,只是stm32发送的数据要用树莓派的ros系统上来接收,我们这次只是为了验证能否正常通信,于是树莓派的ros系统上我们就用cutecom串口收发助手来进行接收 二、具体操作: 1、接线: 我们使用TTL转串口来进行,注意stm32引出的串口RX、TX要和TTL转串口的TX、RX交错连接,引脚电平3v3,别忘了GND。 2、stm32端的代码编
[单片机]
<font color='red'>STM32</font>与树莓派<font color='red'>串口</font>通信实现(简易教程,无需安装micro-ROS版)
STM32串口通信蓝牙(BLE)详解与实践
一、串口通信的原理与应用 通信的方式 处理器与外部设备之间或者处理器与处理器之间通信的方式分两种:串行通信和并行通信。 串行通信 传输原理:数据按位依次顺序传输(每一位占据固定的时间长度 MSB or LSB) 优点:占用引脚资源少、成本低、传输距离远 缺点:速度慢 应用场合:常用于工控、测量设备,以及部分通信设备 如蓝牙模块、WIFI模块… 并行通信 传输原理:数据按位同时传输(按照字节或者字节的倍数去传输) 优点:速度快 缺点:占用引脚多,成本高、传输距离近、抗干扰能力弱 应用场合:一般适用数据量大、传输距离较近的场合 如计算机总线 串行通信分类 如果按照数据的传送方向,可以分为3种 单 工 :数
[单片机]
<font color='red'>STM32</font><font color='red'>串口</font>通信蓝牙(BLE)详解与实践
STM32串口中断控制LED闪烁速度:原理详解与代码实现指南
一、项目背景与目标 在嵌入式系统开发中,经常需要通过外部输入动态调整设备行为。本项目实现通过串口中断接收上位机指令,实时修改 LED 的闪烁间隔,从而控制闪烁速度。核心目标是理解 STM32 的串口中断机制、GPIO 输出控制以及中断优先级配置,掌握通过外部输入动态调整程序逻辑的方法。 二、硬件准备 1.硬件平台: STM32F103 开发板(如 Blue Pill,核心为 STM32F10x 系列) 板载 LED(通常连接到 GPIOC Pin13,即 PC13) USB 转 TTL 模块(用于串口通信,连接 STM32 的 USART1) 连接线(杜邦线) 2.硬件连接: STM32 引脚 功能 连接对象
[单片机]
STM32与ESP8266结合使用MQTT协议实现数据发送至oneNET云平台串口通信详解
前言:这是基于STM32和ESP8266 WIFI模块的实战应用,全程干货满满,筑波已经踩玩了全部的坑,可放心食用。接下来我仔细介绍一下我的开发历程,希望对大家的学习有所帮助,也欢迎各位大佬来详细指出错误!!! 前提是自己已经烧录好了固件!!!!! 可以去安信可里寻找适合自己的固件,在乐鑫网站找烧录软件,这里不再解释。 AT固件汇总 | 安信可科技 https://www.espressif.com.cn/en/support/download/other-tools 准备材料:ESP8266模块,STM32开发板,oneNET云平台账号,CH340,ST-Link V2,串口i烧录助手(筑波用的是XCOM) 首先先给大
[单片机]
<font color='red'>STM32</font>与ESP8266结合使用MQTT协议实现<font color='red'>数据</font>发送至oneNET云平台<font color='red'>串口</font>通信详解
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved