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

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

物联沃分享整理
物联沃-IOTWORD物联网 » 解决STM32 HAL库中HAL_UART_Transmit函数的BUG问题及解决方法

发表评论