STM32单片机的USART接收数据问题解决方案

发布者:MysticGarden最新更新时间:2024-05-11 来源: elecfans关键字:STM32  单片机  USART  接收数据 手机看文章 扫描二维码
随时随地手机看文章

先使用USART中断函数接收数据,判断是否接收到每帧数据的起始标记字符。如果接收到就关闭USART中断,然后开启DMA用于后续串口数据的接收。但是出现一个问题是每帧数据的起始标记为:A5 4A 05 00 00 40 81


然后开启DMA传输后所接收收到的第一个数据为0x81,也就是起始标志字符的最后一个数据。


造成这样问题的原因是:

在USART初始化时使用了函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);

虽然此时DMA没有被使能,但是硬件上已经开始做DMA传输检测了。

解决办法:

将函数:USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);从串口初始化函数中删除掉,然后和使能DMA传输函数放在一起。这样就成功解决问题了。


关键字:STM32  单片机  USART  接收数据 引用地址:STM32单片机的USART接收数据问题解决方案

上一篇:IAR单片机编程软件建立stm32工程的方法解析
下一篇:如何通过STM32驱动nRF24L01发送数据

推荐阅读最新更新时间:2026-03-23 21:42

STM32CUBEMX(2)--USART通过DMA方式接收不定长数据
概述 直接存储器访问(DMA)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何CPU操作的情况下通过DMA快速传输传输。这样节省的CPU资源可供其它操作使用。 DMA允许在后台执行数据传输,无需Cortex-MO处理器干预。在此操作过程中,主处理器可以执行其它任务,仅当整个数据块需要处理时,才会中断主处理器。这样即使传输大量数据也不会对系统性能造成太大影响。 DMA主要用于为不同的外设模块实现集中数据缓冲存储(通常在系统SRAM中)。与分布式解决方案(其中每个外设都需要实现自己的本地数据存储)相比,DMA解决方案在硅片成本和功耗方面的成本较低。 根据使用的产品型号的不同,有一个或两个DM
[单片机]
【STM32Cube_06】使用USART发送和接收数据(查询模式)
1. 准备工作 硬件准备 首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi): 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码; 准备一个串口调试助手,这里我使用的是Serial Port Utility; 2.生成MDK工程 选择芯片型号 打开STM32CubeMX,打开MCU选择器: 搜索并选中芯片STM32L431RCT6: 配置时钟源 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC; 如果使用默认内部时钟(HSI),这一步可以略过; 这里我都使用外部时钟: 配置串口 小熊派开发板板载ST-Lin
[单片机]
【STM32Cube_06】使用<font color='red'>USART</font>发送和<font color='red'>接收</font><font color='red'>数据</font>(查询模式)
STM32F103RC USART2串口查询方式接收数据
现有一个小需求,使用STM32F1系列单片机做串口2的收发数据的功能,通过PC上的串口调试助手给单片机发一串数据,单片机收到数据后再给PC的串口调试助手发回去。 看似简单的功能,调试了好久才调好,记录一下供大家参考。 STM32使用USART2,对应单片机的PA1控制方向,PA2发送,PA3接收。 代码如下: z_hardware_usart2.h #ifndef __STM32F10X_H #define __STM32F10X_H #include stm32f10x.h #endif #ifndef __Z_UTIL_TIME_H #define __Z_UTIL_TIME_H #include z
[单片机]
STM32F103RC <font color='red'>USART</font>2串口查询方式<font color='red'>接收</font><font color='red'>数据</font>
STM32-USART HAL库接收任意长度数据详细解析
前言: 最近在调试STM32L152 HAL库串口接收任意长度数据程序,详细解析下接收任意长度数据的方法。 硬件平台:STM32L152 软件平台:keil v5+cubeMX 函数库:HAL库 STM32L152 —USART STM32L152 USART 的HAL库中接收函数: HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size); 该函数的参数Size固定,使用时很不方便,只能接收固定长度的数据。 本文详细解析HAL库UASRT接收函数并修改成接收任意长度。P
[单片机]
USART串口发送接收数据
1.发送模块程序及仿真图 (程序中发送数据为0x03) (以下是发送模块程序) #include pic.h __CONFIG(HS&UNPROTECT&DUNPROT&PWRTDIS&BORDIS&WDTDIS&LVPDIS&DEBUGEN&WRTEN); #define uchar unsigned char #define uint unsigned int uchar k,d; void usartint(void) { TRISC=0xC0;//RC端口RC6、RC7分别为输出和输入1100 0000 SPBRG= 77;//设置波特率9600,系统时钟12MHZ TXST
[单片机]
STM32单片机Usart2串口的调试方法
先是参考http://wenku.baidu.com/view/78f6b1350b4c2e3f572763e9.html调通了usart1 然后将程序进行修改,对Usart2进行配置,配置完了之后,程序还是没有正确,然后在voidGPIO_cfg();函数中添加一句 GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE); 最后程序如下, #include“stm32f10x_lib.h” FlagStatusRX_status; FlagStatusTx_status; voidRCC_cfg(void); voidGPIO_cfg(void); voidUSART_cfg(void);
[单片机]
<font color='red'>STM32</font><font color='red'>单片机</font>的<font color='red'>Usart</font>2串口的调试方法
STM32USART接收中断问题使单片机死机
问题描述: 在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发送!问题就出来,不到1分钟时间,通讯没有反应了,死机了。USART配置代码如下: void uart_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate); USART_InitStructure.USART_WordLength = USA
[单片机]
Stm32采用环形缓冲区接收rk3588的数据代码
```c #include stm32f10x.h #include usart.h #include ring_buffer.h #define BUFFER_SIZE 128 uint8_t buffer ; // 定义一个大小为128的缓冲区 ring_buffer_t ring_buffer; // 定义一个环形缓冲区结构体 void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 判断是否接收到数据 { uint8_t data = USART_ReceiveData(USART1); // 读取接收
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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