STM32cubemx:version5.1

Chip: STM32F446RE

IDE:Keil5

Q:小项目上写了个简单的通信包,波特率230400,数据量较大1600Byte/s,DMA的方式实现接收,量产后发现跑久了部分机器会有只能发送不能接收的问题。

查了很久没查到。中间加了断线检测,重新初始化串口,却无法解决。最后面发现,HAL的锅。

部分代码:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART4) {
uint8_t ret=HAL_OK;
if(frame_in_sync) {
if(UART_Rx_Buffer.head == 0x55 && UART_Rx_Buffer.end == 0xAA) { // TODO: check check-sum
UART_Rx_Data = UART_Rx_Buffer;
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, sizeof(UART_Rx_Buffer));
uart_updata_time= HAL_GetTick(); } else { // frame not in sync, drop coming bytes until read an end(0xAA)
frame_in_sync = 0;
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, 1);
}
} else {
 if( *(uint8_t *)&UART_Rx_Buffer == 0xAA) {
frame_in_sync = 1;
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, sizeof(UART_Rx_Buffer));
} else {
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, 1);
}
}
}
}

上述的代码绝大多数时间都能够正常运行。但是,总会出现莫名奇妙的掉线问题。并且难以复线。查了好久,看到有类似的问题,HAL库会不处理异常的行为,要用户处理。

在某些情况下,HAL_UART_Receive_IT 并没有成功执行,返回了busy 或者erro,这时候整个流程就背打断了。并且串口还会被莫名其妙锁上。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART4) {
uint8_t ret=HAL_OK;
if(frame_in_sync) {
if(UART_Rx_Buffer.head == 0x55 && UART_Rx_Buffer.end == 0xAA) { // TODO: check check-sum
UART_Rx_Data = UART_Rx_Buffer;
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, sizeof(UART_Rx_Buffer));
uart_updata_time= HAL_GetTick(); } else { // frame not in sync, drop coming bytes until read an end(0xAA)
frame_in_sync = 0;
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, 1);
}
} else {
if( *(uint8_t *)&UART_Rx_Buffer == 0xAA) {
frame_in_sync = 1;
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, sizeof(UART_Rx_Buffer));
} else {
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, 1);
}
}
while(ret!=HAL_OK){
/*try to fix connection bug 20191225*/
printf("UART4:RECEIVE_IT:%d\r\n",ret);  //for log
huart->RxState = HAL_UART_STATE_READY;
__HAL_UNLOCK(huart);
ret=HAL_UART_Receive_IT(&huart4, (uint8_t *)&UART_Rx_Buffer, 1);
}
}
} void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
if(huart->ErrorCode&HAL_UART_ERROR_ORE)
{
__HAL_UART_CLEAR_OREFLAG(huart);
}
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_ErrorCallback can be implemented in the user file.
*/
}

修改后,出现busy或者erro时强制解锁,重新接收。根据log,大约半小时会出现一次。三台经常性出现的机子更新后运行一天,没有出现这个问题。在log中查看到了对应的修正过程。

STM32cubemx-HAL库串口断线问题的更多相关文章

  1. STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收

    参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...

  2. STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收

    转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676

  3. stm32 hal库串口通信资料汇集

    串口的发送接收函数:HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制.HAL_UART_Receive();串口轮询模式发送,使用超时管理机制.HAL_UART_Transm ...

  4. 【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)

    截图 描述: l  STM32 HAL库编程 l  使用模拟IIC通信,方便程序移植 l  Python界面编写,蘑菇头的帽子是什么颜色 l  STM32 HAL库串口通信 l  Python界面使用 ...

  5. STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率

    前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...

  6. (4)STM32使用HAL库实现串口通讯——理论讲解

    一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...

  7. stm32 HAL库笔记(一)——串口的操作

    昨天分析了普通io口的使用,和初始化代码流程,回顾一下,首先定义一个配置io口功能的结构体,然后开启时钟,再去配置这个结构体里面的各个成员变量,每个成员变量都有很多种选择,可以看各个成员变量 后面的注 ...

  8. STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料

    微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原子的例程资料 硬石科技stm32cube: 链接:https://pan.ba ...

  9. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  10. STM32F072从零配置工程-基于HAL库的串口UART中断配置

    先上一个采用串口直接传输的Demo: 此处的思路是完全采用HAL库来实现的,核心是运用HAL_UART_Transmit_IT和HAL_UART_Receive_IT两个函数来实现的,可以作为一个De ...

随机推荐

  1. 001. html篇之《基础内容》

    html基础内容 1. 什么是html Hypertext Markup Language 超文本标记语言 2. 基本结构 <!DOCTYPE html> <!-- 此为html5的 ...

  2. 一些sql查询的case

    1.单列去重,输出去重后条目数量 select count(distinct(`id`)) from student; 2.根据分数段统计数据条目:利用case when selectcount(ca ...

  3. Mysql的性能优化方案

    MySQL的性能优化主要分为以下四个方面 设计: 存储引擎.字段类型.范式与逆范式 功能: 索引.缓存.分库分表.数据库连接池 架构上: 读写分离.集群.均衡负载 合理的SQL: 测试.优化查询语句. ...

  4. 关于 dangerouslySetInnerHTML

    之前不太了解react,第一次看dangerouslySetInnerHTML,以为可以用来防止xss注入. 后面看待又补充了一个DOMPurify,才知道这个东西只有一个提醒的作用,并不能防止xss ...

  5. 设置apt安装软件时是否保留下载的deb包(apt不清理/apt下载软件包)

    原文:https://blog.csdn.net/FoxBryant/article/details/123226245 不喜欢CSDN,记录一下. 默认情况下使用apt install安装包时,会自 ...

  6. 压缩打包,tar

    压缩打包命令 创建压缩包 tar -zcvf /home/xxxx.tar.gz /xahot 解压 tar -zxvf xxx.tar.gz gzip   xxxx  自动变为 xxx.gz

  7. 《Vue.js 3.x高效前端开发(视频教学版)》简介

    #好书推荐##好书奇遇季#<Vue.js 3.x高效前端开发(视频教学版)>,京东当当天猫都有发售.本书配套示例源码.PPT课件.思维导图.数据集.开发环境与答疑服务. 本书通过对Vue. ...

  8. SourceInsight中inc文件中的符号不能同步问题

    解决方法: 打开Options->Preferences->Syntax Formatting->File Types,然后选中对应的开发语言,如C/C++ Source File, ...

  9. Linux firewall 命令

    常用命令 开启端口命令 firewall-cmd --zone=public--add-port=443/tcp --permanent --zone  #作用域 --add-port=80/tcp ...

  10. Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist:...

    大家都知道Centos8于2021年年底停止了服务,大家再在使用yum源安装时候,出现下面错误"错误:Failed to download metadata for repo 'AppStr ...