0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32串口中断接收不定长报文介绍

冬至子 来源:一养喵子的 作者:手辰 2023-10-26 11:01 次阅读

功能实现背景介绍

本项目中,需要使用STM32的USART6串口与FPGA板(下位机)通信,需要发送和接收数据,有报文应答机制。

使用的报文规则如表格所示

图片

板间报文的通信协议,校验使用的是和校验

U8 TX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度
{ 
    U8 i, ret = 0;
    for(i=0; i< len; i++)
    {
        ret += *(buf++);
    }
     ret = ~ret;
    return ret;
}
U8 RX_CheckSum(U8 *buf, U8 len) //buf为数组,len为数组长度
{ 
    U8 i, ret = 0;
     for(i=0; i< len; i++)
    {
        ret += *(buf++);
    }
    ret = ret;
    return ret+1;
}

发送和接收的报文要满足不定长

HAL库的中断接收函数

如果要直接使用HAL库的中断接收函数,也就是HAL_UART_Receive_IT()函数

HAL_UART_Receive_IT(&huart6,UART6_RxBuffer,5);              //下位机FPGA

在使用时,选择串口,选择接收的缓冲区,选择接收长度。

/**
  * @brief  Receives an amount of data in non blocking mode.
  * @note   When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01),
  *         the received data is handled as a set of u16. In this case, Size must indicate the number
  *         of u16 available through pData.
  * @param  huart Pointer to a UART_HandleTypeDef structure that contains
  *               the configuration information for the specified UART module.
  * @param  pData Pointer to data buffer (u8 or u16 data elements).
  * @param  Size  Amount of data elements (u8 or u16) to be received.
  * @retval HAL status
  */
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
{
  /* Check that a Rx process is not already ongoing */
  if (huart- >RxState == HAL_UART_STATE_READY)
  {
    if ((pData == NULL) || (Size == 0U))
    {
      return HAL_ERROR;
    }

    /* Process Locked */
    __HAL_LOCK(huart);

    huart- >pRxBuffPtr = pData;
    huart- >RxXferSize = Size;
    huart- >RxXferCount = Size;

    huart- >ErrorCode = HAL_UART_ERROR_NONE;
    huart- >RxState = HAL_UART_STATE_BUSY_RX;

    /* Process Unlocked */
    __HAL_UNLOCK(huart);

    /* Enable the UART Parity Error Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_PE);

    /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
    __HAL_UART_ENABLE_IT(huart, UART_IT_ERR);

    /* Enable the UART Data Register not empty Interrupt */
    __HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}

这个函数本质上其实不是中断接收函数,只是配置函数,配置开启中断的信息,并且接收多少定长的数据结束本数据接收,串口的中断接收还是在中断中进行。

我们本次的长度虽然也是定长,但是有两种长度数据的接收,所以还是从设计接收不定长的数据为最终效果。

状态机的运用

对于不定长数据的接收,使用了状态机,分两次中断来接收数据

图片

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart- >Instance == USART6)	                                 // 判断是由哪个串口触发的中断
	{
		if(StateMachine_USART6)                                      //状态机为1,都接收完毕,准备校验
		{	
      if(re_flag6 == 1)
			{
				UART6_RxCounter = 6;
				re_flag6 = 0;
			}	
      else
			{
				len_counter6 = 2+5+UART6_RxBuffer[2]+(UART6_RxBuffer[3]< < 8);  
			  if(UART6_RxBuffer[len_counter6 - 1] == 0x55 && UART6_RxBuffer[0] == 0xAA)	
			  {
				  UART6_RxCounter = len_counter6;
			  }	
        else
			  {
				  memset(UART6_RxBuffer,0,0x400);
					UART6_RxCounter = 0;
			  }		
			}				
      		
			StateMachine_USART6 = 0;                                   //状态机为0
      len_counter6 = 0;			
			HAL_UART_Receive_IT(&huart6,UART6_RxBuffer,5);		
		}
		else                                                         //状态机为0,只接受到了前五个字节,继续接收后面的字节
		{					
			if(UART6_RxBuffer[0] == 0xAA)
			{
				StateMachine_USART6 = 1;
				UART6_RxCounter = 5;
				if(UART6_RxBuffer[2] == 0 && UART6_RxBuffer[3] == 0)
			  {
				  HAL_UART_Receive_IT(&huart6,(uint8_t*)&UART6_RxBuffer[5], 1);
					re_flag6 = 1;
			  }
			  else
			    HAL_UART_Receive_IT(&huart6,(uint8_t*)&UART6_RxBuffer[5], 2 + UART6_RxBuffer[2] + (UART6_RxBuffer[3] < < 8));
			}
			else
			{
				memset(UART6_RxBuffer,0,0x400);
				UART6_RxCounter = 0;
				HAL_UART_Receive_IT(&huart6,UART6_RxBuffer,5);
			}
			
		}
	}
}

核心思想就是先接收报文的头,根据头来判断后面的长度,把应答报文和音量数据报文区分开,不合格的报文直接舍去同时开启新的接收。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1603

    文章

    21328

    浏览量

    593287
  • STM32
    +关注

    关注

    2240

    文章

    10675

    浏览量

    348868
  • 下位机
    +关注

    关注

    0

    文章

    78

    浏览量

    18611
  • 串口中断
    +关注

    关注

    0

    文章

    63

    浏览量

    13615
  • USART串口
    +关注

    关注

    0

    文章

    31

    浏览量

    6723
收藏 人收藏

    评论

    相关推荐

    FreeRTOS串口中断接收不定长的数据与二值信号量的使用

    FreeRTOS例程,使用串口中断接收不定长的数据,以及二值信号量的使用
    的头像 发表于 09-26 09:02 3513次阅读
    FreeRTOS<b class='flag-5'>串口中断</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b>的数据与二值信号量的使用

    CW32L083串口中断+定时器实现不定长数据接收

    CW32L083 用串口中断加定时器中断实现串口不定长数据的接收,特别适用于AT指令的接收
    的头像 发表于 07-12 09:00 1076次阅读
    CW32L083<b class='flag-5'>串口中断</b>+定时器实现<b class='flag-5'>不定长</b>数据<b class='flag-5'>接收</b>

    stm32串口怎么用DMA接收不定长数据?

    stm32串口怎么用DMA接收不定长数据,求大神点播1. 网上查到,空闲中断+DMA可以接收
    发表于 08-21 09:21

    stm32串口是如何实现接收不定长度数据的呢

    stm32串口是如何实现接收不定长度数据的呢?串口接收数据一般会采用
    发表于 08-11 08:18

    如何接收STM32串口不定长字符?

    如何接收STM32串口不定长字符?
    发表于 12-07 07:04

    STM32F103串口中断是如何去接收不定长字符

    STM32F103串口中断是如何去接收不定长字符的?有什么方法吗?
    发表于 12-08 07:40

    接收STM32串口中断+DMA不定长字符的方法是什么

    接收STM32中断+DMA不定长字符的方法是什么
    发表于 12-09 07:52

    如何利用串口空闲中断接收不定长数据

    在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用
    发表于 02-22 07:34

    如何去实现STM32串口接收不定长数据原理与源程序呢

    **STM32串口接收不定长数据原理与源程序**CSDN上有很多关于STM32串口
    发表于 03-02 07:40

    STM32串口接收不定长数据的程序免费下载

    本文档的主要内容详细介绍的是STM32串口接收不定长数据的程序免费下载。
    发表于 08-26 08:00 47次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b>数据的程序免费下载

    stm32 串口接收不定长度数据及黏包处理 + 串口DMA接收

    ,那么stm32串口是如何实现接收不定长度数据的呢? 串口接收数据一般会采用
    发表于 12-23 19:09 26次下载
    <b class='flag-5'>stm32</b> <b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b>度数据及黏包处理 + <b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b>

    STM32 DMA串口接收不定长数据

    STM32 DMA串口接收不定长数据
    发表于 12-24 18:50 40次下载
    <b class='flag-5'>STM32</b>  DMA<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b>数据

    STM32串口DMA接收不定长数据

    在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢?同学A:数据来
    发表于 12-24 19:03 30次下载
    <b class='flag-5'>STM32</b>之<b class='flag-5'>串口</b>DMA<b class='flag-5'>接收</b><b class='flag-5'>不定长</b>数据

    STM32单片机串口空闲中断+DMA接收不定长数据

    在上一篇文章STM32单片机串口空闲中断接收不定长数据中介绍了利用
    发表于 12-27 19:24 18次下载
    <b class='flag-5'>STM32</b>单片机<b class='flag-5'>串口</b>空闲<b class='flag-5'>中断</b>+DMA<b class='flag-5'>接收</b><b class='flag-5'>不定长</b>数据

    STM32CubeMX之串口接收不定长数据

    基本串口通信通常只能接收定长数据,无法稳定接收不定长数据,本章介绍利用
    的头像 发表于 05-11 09:59 2262次阅读
    <b class='flag-5'>STM32</b>CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定长</b>数据