STM32 HAL 库 串口 函数HAL_UART_Transmit的BUG问题 及解决方法

通过修改HAL_UART_Transmit_DMA()函数,解决串口发送DMA只能发送一次的问题 通过修改STM32HAL库的HAL_UART_Transmit_DMA()函数成功解决串口DMA只能发送一次的问题,并且也支持在主函数的高速while循环中调用串口的DMA请求。 阅读详情
AI摘要

在开发图传项目中遇到STM32HAL库串口函数处理大数据量时的Bug,导致数据包发送不完整。建议改用直接写寄存器方法,如STM32H7可写TDR寄存器并检测ISR状态位,确保数据完整发送。对于Cortex-M4或M3,可能需要添加延时。

近期在开发图传项目的时候,由于需要发送的数据量及其庞大,因此在处理的时候, 发现STM32HAL库的串口函数,在处理海量数据的时候, 存在bug, 导致不能将指定数量的数据全部发送出去。 

例如, 我以200个字节为一个数据包, 使用HAL_UART_Transmit函数,通过串口发送。 那么, 在发送几千个数据包后, 会出现单个数据包发送不完整的情况(200个字节一个包, 实际上可能只发送了60个字节出去,就没有任何征兆的提前结束了,并开始发送下个数据包)。 导致图像数据丢失。 

因此, 在需要使用串口发送大量数据的时候, 建议不要使用HAL库的函数, 而是直接对寄存器操作。 这里以STM32H7为例,(因为H7将DR寄存器分成了TDR和RDR, 解决了之前只有一个DR寄存器导致直接写寄存器不延时丢第一位数据的问题)  

直接写寄存器代码: (替代HAL库)

uint8_t *p; 
p=(uint8_t *) DATA_BUF; //设定指针地址

//发送部分:
for(i=0;i<send_size;i++)  send_size: 需要发送的字节数量
{
uart->TDR = P[i];    //将一个字节数据写入TDR寄存器
while((uart->ISR&0x40)==0); //检测写入TDR的这个字节是否发送完毕
}

如果使用的是cortex M4,或者M3 内核 需要在前面加个延时。 当然也不会有人用这两款搞图传, 毕竟没有JPEG硬件压缩。

串口助手乱码 问题描述 开发板A的uart串口,用串口助手和电脑连接总是显示乱码: 最开始用U转串线连接板子和电脑——可能电平不匹配导致的乱码; 之后换了两块USB转TTL电平模块,串口助手都是乱码; 我怀疑是程序的问题 发送0x55、0xff到uart,用示波器测试都是正常的信号; 难道我拿到的USB转TTL模块都有问题????? 解决思路(感谢xy) 用开发板A作为发送端,用开发板B(提前测验过,可以正常使用)作为接收端,用uart通信,如果能正常通信,说明A的uart没有问题,两个U转T模块都有问题。如果B收集不到 阅读详情

相关推荐

HAL库串口分析

stm32HAL库的三种串口发送和接收的方法。

qq_36314279的博客 1万+

完美解决HAL库HAL_UART_Transmit_DMA()不延时就发不了下一条的问题

解决HAL库HAL_UART_Transmit_DMA()不延时就发不了下一条的问题, 解决HAL_DMA_GetState(&hdma_usart1_tx)参数未声明报错问题

m0_68619789的博客 1万+

HAL库STM32的串口收发教程

去。

m0_72105882的博客 9716

STM32 HAL UART DMA不通的问题解决及注意事项

STM32 HAL UART DMA不通的问题解决及注意事项 在运行STM32CUBIDE生成的工程时,UART DMA不工作,其原因是软件生成工程文件的一个准“bug’。 问题起源 在用STM32CUBEIDE(或STM32CUBEMX)生成的工程,采用DMA方式接收或发送都无反应。如下面的UART1的DMA发送代码: while (1) { HAL_UART_Transmit_DMA(&huart1, UART1_RX, 4); HAL_Delay(1000); } 在

Pegasus的软件博客 7405

STM32 HAL库串口库分析

这里不对基本操作分析,仅仅讨论一种方式,能让我们稳定的用串口,本文会对HAL库进行些微的修改。 HAL库的串口大致可以分解为2个部分,一个是寄存器控制部分,一个是数据传输部分。我接下来的只修改寄存器控制部分一点点内容,数据传输部分不变,任然采用其回调函数形式,下面具体说明。 一般来说最常用的是发送数据HAL_UART_Transmit,中断接收数据HAL_UART_Transmit_IT。串口...

suxingtian的博客 9448

STM32 HAL库hal_uart_transmit快速理解

通过实例解析hal_uart_transmit的使用方法与工作原理,掌握STM32串口发送核心技巧,提升嵌入式开发效率。重点剖析hal_uart_transmit在实际项目中的应用场景与常见问题。

weixin_35935514的博客 1063

【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解

前言: 今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片:STM32F407ZET6 2、STM32CubeMx软件 3、IDE: M...

Z小旋 35万+

【STM32+cubemx】0004 HAL库开发:uart串口的轮询和中断使用

本节我们来学习异步串口uart的使用,包括轮询方式和中断方式。 本节我们使用轮询和中断两种方式,来实现计算机向单片机发送数据,单片机处理之后再将数据返回。 1)cubemx生成代码 首先还是在cubemx中生成代码,选择器件、设置SYS(调试接口)、设置RCC(外部晶振时钟源)这几个步骤和前一节一样(也可以复制前面闪灯的工程,在上面修改)。 然后设置串口引脚,这里我们选择uart1,异步串口,选完后,已经使用的串口引脚PA9和PA10会变成绿色;然后选择开启串口全局中断: 之后,和上一节一

小白白学电子 4027

STM32 HAL库函数学习 UART篇

从今天开始定时更新一下有关STM32 HAL库学习的过程,主要是对HAL库函数的所有讲解。 HAL_USART_Init(USART_HandleTypeDef * husart) 初始化串口的的函数: 用法为 UART_HandleTypeDef huart1; huart1.xxx = ssss; ... HAL_USART_Init(&huart1); //需要注意点的是函数的输入参数是指针类型 UART_HandleTypeDef huart4; huart4.Inst.

s2014201506的博客 3万+

stm32 HAL库 HAL_UART_Transmit_DMA 发送函数分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33979363的博客 1万+

STM32--HAL库--UART使用

写在前面的话 欢迎大家在评论区指正错误,该博文是我在这几天使用hal库的时候碰到的问题的记录,对于暂时没有写的像dma、阻塞接收等函数,在后期如果我用道的话,我也会在该博文里面更新。当让也欢迎大家在评论区指正。 函数 在这里不介绍关于DMA的操作,只是用有关串口的阻塞和非阻塞函数。 HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); H

秘术师阿飞 2277

STM32 HAL库 STM32CubeMx -- 串口的使用(USART/UART)

STM32 HAL库 STM32CubeMx 串口的使用(USART/UART) 串口阻塞方式收发 串口中断模式收发 printf重定向

Dir_x的博客 1万+

手把手教你使用hal_uart_transmit实现数据发送

深入讲解如何使用hal_uart_transmit实现UART数据发送,结合实际操作步骤和常见问题解析,帮助开发者快速上手嵌入式通信开发,提升调试效率。

weixin_42527665的博客 1697

基于STM32CubeMX和HAL库的USART串口收发数据

r\n";//输出信息char c;//指令 0:停止 1:开始//输出信息//出错char tips1[]="开始.....\r\n";//开始发送char tips2[]="停止......\r\n";//停止发送int flag=0;//标志 0:停止发送 1.开始发送DMA(Direct Memory Access,直接内存访问)是一种计算机系统中用于数据传输的机制。它允许数据在外设和内存之间直接传输,而不需要CPU的介入,从而减轻了CPU的负担,提高了数据传输的效率。

2201_75737320的博客 3758

hal_uart_transmit与DMA协同工作完整指南

深入解析hal_uart_transmit如何与DMA协同提升UART传输效率,通过合理配置减少CPU占用,实现高效串口通信,适用于嵌入式开发中对实时性要求较高的场景。

weixin_36474966的博客 1172

mstar PQ软件修改方法

1.修改ADC的值 Static code APIXC_AdcGainOffsetSetting tADCSetting[ADC_SET_NUMS]= #define INIT_ADC_RGB_RED_GAIN               0x1000 #define INIT_ADC_RGB_GREEN_GAIN           0x1000 #define INIT_ADC_RGB

qq_18810259的专栏 2565

STM32 HAL库的HAL_UART_Transmit_IT使用方法

相较于HAL_UART_Transmit()一直阻塞在while循环(函数内部)里等待直到所有数据发送完毕,HAL_UART_Transmit_IT()以中断模式发送,函数内容仅仅为把数据信息传递给串口句柄结构体变量,然后就可以去执行别的内容了。可以看到,发送完成会调用UART_EndTransmit_IT(huart),这哥们儿会调用HAL_UART_TxCpltCallback(huart),没错你去定义它,然后写上发送完要干什么事情就行了。是STM32 HAL库中非阻塞的串口发送函数。

u014414331的博客 1万+

整合Springboot+MybatisPlus+达梦数据库

整合Springboot+MybatisPlus+达梦数据库,以及一些坑

波波的博客 6678

关于stm32 hal库usart HAL_UART_Transmit_IT函数解析

1、原因 最近在看安富莱的bsp教程,关于usart的部分使用了fifo的管理,但是安富莱的教程中,FIFO管理部分都是自己写的,而stm32官方的hal库里面,关于usart发送部分是有HAL_UART_Transmit_IT可以以中断的方式发送数据的。我现在的疑惑就是,我只使用安富莱的fifo管理部分,将发送部分交给hal库的函数进行处理,可不可是实现和安富莱bsp教程相同的功能。 2、函数解析 HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleType

秘术师阿飞 1万+

OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation

电磁线圈组驱动经典系统,可以作为参考。 OctoMag: 用于5自由度无线微操作的一个电磁铁系统 OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation [1] Paper Link Authors: J. J. Abbott, etc. 2010, TRO IEEE Transactions on Robot...

XU Yangxin的博客 1665

Python爬虫实战:深度解析B站弹幕异步采集技术与数据可视化

title=f"弹幕词云 Top 100 (BV: {bvid})", title_textstyle_opts=opts.TextStyleOpts(font_size=23).add(series_name="弹幕词云", data_pair=list(top_100_words.items()), word_size_range=[20, 100]).add_xaxis([f"{i}-{i+1}分" for i in range(len(time_distribution))])

2201_76125261的博客 640

HAL库实现STM32串口通信

TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。正常通信时模块本身的TXD永远接设备的RXD。

2201_75358123的博客 3156

手把手教你学Simulink——机器人力控场景实例:基于Simulink的永磁同步电机重力补偿力矩控制仿真

本文介绍了基于Simulink的机器人重力补偿力矩控制仿真方法。针对机器人悬停时电机发热、抖动等问题,提出通过前馈补偿重力转矩的解决方案。文章详细阐述了从机器人动力学建模、重力补偿计算、PMSM转矩控制到系统集成的完整实现流程,并以2-DOF机械臂为例验证了补偿效果。结果表明,重力补偿能显著降低电机电流和拖拽力,提高系统柔顺性。文中还提供了高级功能扩展方向,如参数辨识、摩擦补偿等,为实际工程应用提供了参考框架。

MHD0815的博客 154
上一篇: 笔记: C语言中的骚操作 (带参宏定义及三目运算实例)
下一篇: CubeMX 配置LWIP 使用中断的方法(2023.10.11)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值