<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
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
    +關注

    關注

    1608

    文章

    21367

    瀏覽量

    594671
  • STM32
    +關注

    關注

    2245

    文章

    10688

    瀏覽量

    349658
  • 下位機
    +關注

    關注

    0

    文章

    90

    瀏覽量

    18631
  • 串口中斷
    +關注

    關注

    0

    文章

    64

    瀏覽量

    13676
  • USART串口
    +關注

    關注

    0

    文章

    32

    瀏覽量

    6751
收藏 人收藏

    評論

    相關推薦

    FreeRTOS串口中斷接收不定長的數據與二值信號量的使用

    FreeRTOS例程,使用串口中斷接收不定長的數據,以及二值信號量的使用
    的頭像 發表于 09-26 09:02 ?3572次閱讀
    FreeRTOS<b class='flag-5'>串口中斷</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b>的數據與二值信號量的使用

    CW32L083串口中斷+定時器實現不定長數據接收

    CW32L083 用串口中斷加定時器中斷實現串口不定長數據的接收,特別適用于AT指令的接收。
    的頭像 發表于 07-12 09:00 ?1192次閱讀
    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

    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>數據

    使用UART IDLE中斷接收不定長數據

    在本文中,將介紹使用該中斷來進行不定長串口數據接收的辦法。通過該中斷,可以省卻用于檢測數據傳輸是否完成的判斷操作。
    發表于 02-08 15:29 ?4次下載
    使用UART IDLE<b class='flag-5'>中斷</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b>數據

    STM32CubeMX之串口接收不定長數據

    基本串口通信通常只能接收定長數據,無法穩定接收不定長數據,本章介紹利用
    的頭像 發表于 05-11 09:59 ?2380次閱讀
    <b class='flag-5'>STM32</b>CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b>數據
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>