STM32cubemx-HAL库串口断线问题
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库串口断线问题的更多相关文章
- STM32CubeMX HAL库串口+DMA数据发送不定长度数据接收
参考资料:1.ST HAL库官网资料 2.https://blog.csdn.net/u014470361/article/details/79206352#comments 一.STM32CubeM ...
- STM32CubeMX HAL库串口: 使用DMA数据发送、使用DMA不定长度数据接收
转载自 https://blog.csdn.net/euxnijuoh/article/details/81638676
- stm32 hal库串口通信资料汇集
串口的发送接收函数:HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制.HAL_UART_Receive();串口轮询模式发送,使用超时管理机制.HAL_UART_Transm ...
- 【情人节选帽子】TCS34725颜色传感器和Python图形界面编程(STM32 HAL库)
截图 描述: l STM32 HAL库编程 l 使用模拟IIC通信,方便程序移植 l Python界面编写,蘑菇头的帽子是什么颜色 l STM32 HAL库串口通信 l Python界面使用 ...
- STM32 HAL 库实现乒乓缓存加空闲中断的串口 DMA 收发机制,轻松跑上 2M 波特率
前言 直接储存器访问(Direct Memory Access,DMA),允许一些设备独立地访问数据,而不需要经过 CPU 介入处理.因此在访问大量数据时,使用 DMA 可以节约可观的 CPU 处理时 ...
- (4)STM32使用HAL库实现串口通讯——理论讲解
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandle ...
- stm32 HAL库笔记(一)——串口的操作
昨天分析了普通io口的使用,和初始化代码流程,回顾一下,首先定义一个配置io口功能的结构体,然后开启时钟,再去配置这个结构体里面的各个成员变量,每个成员变量都有很多种选择,可以看各个成员变量 后面的注 ...
- STM32CUBEMX入门学习笔记3:HAL库以及STM32CUBE相关资料
微雪课堂:http://www.waveshare.net/study/article-629-1.html 之前的正点原子的例程资料 硬石科技stm32cube: 链接:https://pan.ba ...
- STM32 HAL库利用DMA实现串口不定长度接收方法
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...
- STM32F072从零配置工程-基于HAL库的串口UART中断配置
先上一个采用串口直接传输的Demo: 此处的思路是完全采用HAL库来实现的,核心是运用HAL_UART_Transmit_IT和HAL_UART_Receive_IT两个函数来实现的,可以作为一个De ...
随机推荐
- 深度剖析生产工厂用ERP系统进行管理有哪些优势
对于生产制造企业而言,生产现场管理永远是其得以健康发展的重要环节.现场是产品开发和生产的场所,企业要降低成本.按期交付产品,以及产品质量要达到客户所期望的要求和水平,这一切都要在现场实现,企业也正是从 ...
- cookie报错 :服务器异常An invalid character [32] was present in the Cookie value
String KaptchaOwner= CommunityUtil.generateUUID(); Cookie cookie=new Cookie("kaptchaOwner" ...
- docker之安装tomcat
国内Image仓库地址:https://hub.docker.com/search?q=tomcat 安装tomcat docker pull tomcat 查看Image docker images ...
- eclipse配置tomcat环境
Eclipse配置tomcat环境 第一步:进行下面操作: window–>Preference–>Server–>Runtime Environments ->Add 搜索s ...
- -bash: nslookup: 未找到命令;centos7 安装nslookup
一.安装服务 [root@localhost ~]# yum -y install bind-utils 二.查看 [root@localhost ~]# nslookup
- flutter Color和colors
"Color(颜色)"是我们在设置应用程序界面样式时最常用到的属性. Flutter 中颜色设置的方式有很多种,其中最常用的有下列几种: Color c1 = Color(0xFF ...
- 【git】2.3查看提交历史
资料来源 (1) https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4% ...
- go语言的结构体、指针、方法详解
资源来自:https://blog.csdn.net/DXB2021/article/details/122652779 结体体定义如下: type author struct{ field1 typ ...
- Android组件化开发-----页面路由(ARouter)
平时开发中,我们经常用到页面跳转功能.之前我一直使用Intent过跳转 Intent intent = new Intent(A.this, B.class); intent.putExtra(&qu ...
- 关于什么时候用get请求和什么时候用post请求
转载自:(19条消息) 关于什么时候用get请求和什么时候用post请求_火兰的博客-CSDN博客_什么时候用get什么时候用post get和post方法功能类似的,使用建议:1.get方式的安全性 ...