STM32 串口接收不定长数据 HAL_UART_Receive_IT (帧头帧尾)

这篇具有很好参考价值的文章主要介绍了STM32 串口接收不定长数据 HAL_UART_Receive_IT (帧头帧尾)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近使用sw4stm32调试串口时发现串口接收不定长数据很不方便,这里是帧头帧尾的接收方式,欢迎大佬指导。

这里要用串口中断接收的数据帧帧头为0xEB,帧尾为0XBE

这里是其中定义的变量 

#define FRAME_HEADER 0xEB // 帧头
#define FRAME_TAIL 0xBE   // 帧尾
uint8_t rxBuffer[256];    // 接收缓冲区
uint16_t rxIndex = 0;     // 接收缓冲区索引
uint8_t frameStart = 0;   // 帧起始标志
uint8_t frameEnd = 0;     // 帧结束标志

主函数里打开串口接收中断

HAL_UART_Receive_IT(&huart1, &rxBuffer[rxIndex], 1);

然后串口接收处理部分全都写在的回调函数中。文章来源地址https://www.toymoban.com/news/detail-805958.html

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{
		if ((rxBuffer[rxIndex] == FRAME_HEADER) && (!frameStart))//检测帧头
		{
		    frameStart = 1;
		    rxIndex =1;
		}
		else if (rxBuffer[rxIndex] == FRAME_TAIL && frameStart)//检测帧尾
		{
		    frameEnd = 1;
		}
		else
		{
			rxIndex++;
		}
		if (frameStart && !frameEnd)//以一个字节为单位接收数据
		{
			HAL_UART_Receive_IT(&huart1, &rxBuffer[rxIndex], 1);
		}

		if (frameEnd)//接收完成
		{
		    frameStart = 0;
		    frameEnd = 0;
		 }
	}
}

到了这里,关于STM32 串口接收不定长数据 HAL_UART_Receive_IT (帧头帧尾)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(51)
  • 【STM32】HAL库的STOP低功耗模式UART串口唤醒,第一个接收字节出错的问题(已解决)

    【STM32】HAL库的STOP低功耗模式UART串口唤醒,第一个接收字节出错的问题(已解决) 最近做项目时 用到了STOP1停止模式的串口唤醒 唤醒配置如下: 【STM32】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题) 我

    2024年01月15日
    浏览(51)
  • stm32 uart dma方式接收不定长度字符

    一般处理: stm32 uart使用dma接收时,会有自己的数据流中断,数据流中断会调用HAL_UART_RxCpltCallback。但是数据流中断只会在HAL_UART_Receive_DMA函数指定的buffer满时才会触发。 接收不定长度字符,需要和uart的UART_IT_IDLE结合。 两种结合方式 第一种:(习惯标准库的程序员) 步骤

    2024年02月10日
    浏览(34)
  • STM32:串口轮询模式、中断模式、DMA模式和接收不定长数据

           在STM32每个串口的内部都有两个寄存器:发送数据寄存器(TDR)/发送移位寄存器,当我们调用HAL_UART_Transmit 把数据发送出去时,CPU会将数据依次将数据发送到数据寄存器中,移位寄存器中的数据会根据我们设置的比特率传化成高低电平从TX引脚输出。待发送移位寄存器中发

    2024年02月07日
    浏览(53)
  • 嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据

    之前讲过用 利用IDLE空闲中断来接收不定长数据 ,但是没有用到DMA,其实用DMA会更加的高效,MCU也可以腾出更多的性能去处理应该做的事情。 IDLE顾名思义,就是空闲的意思,即当监测到串口空闲超过1个串口的数据帧时,会使状态寄存器(SR或ISR)的IDLE位置位,如果此时控制

    2024年04月17日
    浏览(61)
  • 极度优雅的用stm32串口接收并分析不定长数据的方法(可用于发送和接收浮点数)

    我准备电赛的时候参加了学校为了准备电赛而举办的的积分赛,队友通过树莓派用给stm32发送执行指令,而我在队里作为写单片机的就需要分析数据包,每一个数据包都比较大也比较复杂,而且不定长,用传统的一个字节一个字节接收数据的方式收串口在代码层面上就显得和

    2024年02月04日
    浏览(60)
  • 【STM32笔记】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作、重定向卡死、低功耗一直唤醒的问题)

    【STM32】HAL库UART串口配置及重定向(解决接收中断与scanf不能同时工作、重定向卡死、低功耗一直唤醒的问题) 注意:这里用的编译器版本为ARMCC(也就是第5代编译器 而不是AC6) 首先 要使用printf和scanf 必不可少的就是 这里需要做的就是配置单片机的UART 并且使其能够被pri

    2023年04月08日
    浏览(46)
  • 关于STM32使用HAL_UART_Receive()无法接收数据的问题

    一、问题发现         在项目中我想通过阻塞的方式接收一段来自串口的数据,于是使用了HAL_UART_Receive函数,但跑起来发现一直超时接收不到。网上使劲搜但没搜到啥有用的结果,那只能自己捣鼓了。一开始怀疑是硬件的问题,于是用示波器直接连到对应的rx脚上,发现数据

    2024年02月11日
    浏览(48)
  • STM32 HAL库 串口中断接收数据包

    目录 一、CUBEmx配置 1.设置系统时钟,配置SYS,配置时钟树  ​编辑  2.配置串口USART1 3.配置NVIC,开启串口中断 ​编辑4.点击GENERATE CODE输出文件即可 二、代码部分 0.串口重定向——printf 1.关于舵机 2.开启串口中断函数 3.编写串口回调函数 4.主函数部分 三、实验现象: 四、总

    2024年02月04日
    浏览(42)
  • STM32 HAL库串口突然不再接收数据的异常情况

    STM32串口接收分为阻塞式接收和中断式接收。 1、中断+DMA接收 出现突然不再接收数据的异常情况,最有可能的情况为ORE错误和BUSY标志位持续置高。 解决方法:在重新打开中断接收前,使用__HAL_UART_CLEAR_OREFLAG(huart);函数清除ORE错误;如果串口中断重新接收打开频繁且间隔短的话

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包