当前位置: 首页 > news >正文

HAL库中使用空闲中断+DMA接收数据,接收失败的问题

问题:

串口屏与单片机通过串口(USART1)进行通信,调试时发现问题,现象如下:
手动页面的几个文本,输入的数字不会显示出来,比如初始值为0,输入200,200会一闪而过,又恢复到0。 检查了页面ID和文本ID,单片机解析的函数都没有问题。

①连接上调试器时,文本输入、显示非常正常。
②不接调试器时,文本输入、显示时而正常,时而有问题。

解决:

1,不知道哪里的原因,接上调试器时又运行正常,没法调试。所以只能在代码中给变量赋值,看程序是否运行到某一行

如下所示:
串口接收到数据时,会在串口空闲中断中调用接收函数plcd_device->Receive,所以在plcd_device->Receive中给modbus_data.manual_target_speed赋上不同的值(66、77、88),来判断串口到底有没有接收到正确格式的数据。

uint8_t g_RecvTmpBuf1[256];

void Start_USART1_Recv(void)	//lcd
{
	//使用DMA+idle来接收
	HAL_UARTEx_ReceiveToIdle_DMA(&huart1, g_RecvTmpBuf1, 128);
}


//空闲中断被调用
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if (huart->Instance == USART1) 	//lcd
    {
		/* 把数据写入rx_buf */
		plcd_device->Receive(g_RecvTmpBuf1, Size);
		
		// 重新启动DMA接收
		Start_USART1_Recv();
    }	
}


static void LcdDevice_Receive(uint8_t* data, uint16_t length) 
{
	modbus_data.manual_target_speed = 66;

	// 判断数据帧的头部和尾部是否符合预期
	if(data[0] == 0xee && data[length-1] == 0xff && data[length-2] == 0xff && data[length-3] == 0xfc && data[length-4] == 0xff)
	{
		// 将接收到的有效数据复制到接收缓冲区中
		for (uint16_t i = 0; i < length; i++) 
		{
			plcd_device->rx_buffer[plcd_device->rindex] = data[i];
			plcd_device->rindex++;
			if (plcd_device->rindex >= RSIZE_LCD) // 超过接收缓冲区大小,循环使用
			{
				plcd_device->rindex = 0;
			}
		}

		// 设置接收标志位,表示接收到了一帧数据
		plcd_device->rcv_flag = 1;		


		modbus_data.manual_target_speed = 77;
	} else if(data[0] == 0xA5)
	{
		// 将接收到的有效数据复制到接收缓冲区中
		for (uint16_t i = 0; i < length; i++) 
		{
			plcd_device->rx_buffer[plcd_device->rindex] = data[i];
			plcd_device->rindex++;
			if (plcd_device->rindex >= RSIZE_LCD) // 超过接收缓冲区大小,循环使用
			{
				plcd_device->rindex = 0;
			}
		}

		// 设置接收标志位,表示接收到了一帧数据
		plcd_device->rcv_flag = 1;	
		plcd_device->lcd_step_flag = 1;
	}
	else 
	{
		// 如果数据帧不符合预期,重置索引
		plcd_device->rindex = 0;
		modbus_data.manual_target_speed = 88;
	}

}

结果发现,有时候根本就不会进入接收函数,说明根本就没有接收到串口屏发来的数据。

2,继续研究,
如图,我的启动DMA接收是在任务一开始执行一次,然后在空闲中断中重新使能。
有没有可能是,不知道什么原因,第一次启动之后,后续没有重新启动?
在这里插入图片描述
在这里插入图片描述

所以尝试解决方法:持续使能串口屏的DMA接收。
在这里插入图片描述

果然,接收正常啦!
又掌握了一种调试方法!真不错

关于HAL库中使用空闲中断+DMA接收数据,接收失败的问题,
如果对您有所帮助,麻烦点赞分享,这对我非常重要,感谢!

相关文章:

  • 详解简单选择排序
  • css基础-display 常用布局
  • 1.企业级AD活动目录核心解析:架构、组件与集成实践
  • 【漫话机器学习系列】154.岭回归(Ridge Regression)
  • 【MySQL笔记】库操作与表操作
  • LabVIEW发电平台数据采集系统
  • 云计算中的DevOps是什么?为什么它很重要?
  • SmolVLM2: 让视频理解能力触手可及
  • 介绍一个测试boostrap表格插件的好网站!
  • MyBatisSystemException:Parameter ‘item‘ not found.
  • Unity/C# 常用XML读写方式详解(LINQ to XML、XmlReader/Writer)
  • SLAM十四讲【一】基本概念
  • GPT-5 将免费向所有用户开放?
  • 记录flutter编译项目遇到的问题
  • 2025年01月02日浙江鼎永前端面试
  • C语言入门教程100讲(6)类型修饰符
  • 如何彻底解决Docker Desktop中Kubernetes无法启动问题
  • 【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?
  • 建筑安全员考试:“时间管理” 关键词统筹的备考规划
  • 考研课程安排(自用)
  • 未来之城湖州,正在书写怎样的城市未来
  • 人民时评:透过上海车展读懂三组密码
  • 中华人民共和国和俄罗斯联邦在纪念中国人民抗日战争、苏联伟大卫国战争胜利和联合国成立80周年之际关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 绿城房地产集团:近半年累计花费20.6亿元购买旗下债券
  • 司法部:加快研究制定行政执法监督条例,建立完善涉企行政执法监督长效机制
  • 2025江西跨境电子商务发展交流会召开,探索行业发展新趋势