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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

近期在开发图传项目的时候,由于需要发送的数据量及其庞大,因此在处理的时候, 发现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硬件压缩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值