在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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
    +關注

    關注

    1641

    文章

    21912

    瀏覽量

    611716
  • STM32
    +關注

    關注

    2283

    文章

    10986

    瀏覽量

    361139
  • 下位機
    +關注

    關注

    0

    文章

    94

    瀏覽量

    19018
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14182
  • USART串口
    +關注

    關注

    0

    文章

    32

    瀏覽量

    6994
收藏 人收藏

    評論

    相關推薦

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

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

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

    CW32L083 用串口中斷加定時器中斷實現串口不定長數據的接收,特別適用于AT指令的接收
    的頭像 發表于 07-12 09:00 ?2406次閱讀
    CW32L083<b class='flag-5'>串口中斷</b>+定時器實現<b class='flag-5'>不定長</b>數據<b class='flag-5'>接收</b>

    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串口中斷 DMA接收的幾點注意地方

    STM32串口中斷、DMA接收的幾點注意地方
    的頭像 發表于 03-04 13:57 ?2.1w次閱讀

    STM32串口接收不定長數據的程序免費下載

    本文檔的主要內容詳細介紹的是STM32串口接收不定長數據的程序免費下載。
    發表于 08-26 08:00 ?62次下載
    <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 ?27次下載
    <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 ?41次下載
    <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>數據

    STM32串口中斷應用實例

    本文將介紹如何使用STM32F4的串口接收中斷,通過串口助手模擬上位機發送指令、
    的頭像 發表于 04-20 11:45 ?2611次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口中斷</b>應用實例

    STM32CubeMX之串口接收不定長數據

    基本串口通信通常只能接收定長數據,無法穩定接收不定長數據,本章介紹利用
    的頭像 發表于 05-11 09:59 ?3884次閱讀
    <b class='flag-5'>STM32</b>CubeMX之<b class='flag-5'>串口</b><b class='flag-5'>接收</b><b class='flag-5'>不定長</b>數據

    STM32串口中斷及DMA接收常見的幾個問題

    STM32串口中斷及DMA接收常見的幾個問題
    的頭像 發表于 10-26 16:41 ?4149次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>串口中斷</b>及DMA<b class='flag-5'>接收</b>常見的幾個問題
    主站蜘蛛池模板: 可以免费看的黄色片 | 午夜免费福利在线观看 | 亚洲深夜在线 | 日本在线色视频 | 午夜嘿嘿嘿| 美女 免费 视频 黄的 | 色噜噜久久 | 天天综合网天天综合色 | 美女被免费视频的网站 | 欧美伊久线香蕉线新在线 | 大又大又粗又爽又黄毛片女人 | 国产黄色在线 | 国产日日操 | 欧美成人a视频 | 美女一级a毛片免费观看 | 狠狠干2015| 四虎国产在线 | av网址在线看 | 亚洲国产香蕉视频欧美 | 日日爱网站 | 国产成人一区二区三中文 | 久久久综合久久 | 伊人一区二区三区 | 色多多网| 日本一本高清视频 | 欧美精品一区二区三区在线播放 | 免费又爽又黄1000禁片 | 亚洲综合春色另类久久 | 免费观看欧美成人1314w色 | 欧美一区二区三区不卡免费观看 | 久久久一本波多野结衣 | 久久国产精品免费专区 | 五月月色开心婷婷久久合 | 免费观看视频网站 | 亚洲综合五月天婷 | 西西人体www303sw大胆高清 | 国产男人女人做性全过程视频 | 视频在线观看免费 | 亚洲第一区视频在线观看 | 日本 韩国 三级 国产 欧美 | 岛国一级毛片 |