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. vue用echarts不显示

    在html页面中套vue的情况来使用echarts,或者单独vue使用echarts,出现页面不渲染图表,代码渲染有的情况,加个this.$nextTick(()=>{})让他主动渲染一下就可以 ...

  2. SQL正则查询--查询有效邮箱

    用户表: Users +---------------+---------+| Column Name | Type |+---------------+---------+| user_id | i ...

  3. vue相关组件用法

    <el-checkbox v-model="checkbox.checkModel" :label="index":disabled="chec ...

  4. java8 利用 ConcurrentHashMap list根据 某个属性 去重

    //自定义方法private static <T> Predicate<T> distinctByKey(Function<? super T, Object> k ...

  5. PHY6230 高性价比低功耗高性能 集成32-bit MCU BLE5.2+2.4G芯片

    PHY6230 是一款高性价比低功耗高性能Bluetooth LE 5.2系统级芯片,集成32-bit高性能低功耗MCU,16KB OTP,8KB Retention SRAM和64KB ROM,可选 ...

  6. 使用Git GUI Here进行推送时产生报错

    许多小伙伴在刚使用git时都会遇到这个问题,在推送一次内容之后,想要再次推送新的数据产生报错 下面就是我们的错误提示: 我们需要先把数据进行更新 找到Remote-->Fetch from--& ...

  7. 随机数Random和SecureRandom

    "Random" objects should be reused Bug Critical Main sources owasp-a6 Available SinceNov 16 ...

  8. js 动态给table添加、删除行。

    1.添加table 行 function addtablTr() { var $table = $("#abc"); var vTr = '<tr><td> ...

  9. js右键生成菜单

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Centos7 安装Mysql8 主从数据库

    前提条件 准备了两台虚拟机 mysql-master 192.168.30.199, mysql-slave 192.168.30.198 1:官网下载并安装Mysql8 1:安装mysql 1.1: ...