STM32 FreeRTOS 第二個實驗例子:串口轉發(單字節轉發)

第二個實驗例子:串口轉發(單字節轉發)

目的:通過隊列實現Usart1接收數據,由Usart2轉發出去

 

Step1:串口

聲明串口接收緩存,並添加串口回調函數

usart.h :

/* USER CODE BEGIN Private defines */

#define UART_BUF_SIZE 1       //緩衝長度爲 1

extern  uint8_t UTART_BUF[UART_BUF_SIZE];    //全局變量

/* USER CODE END Private defines */

usart.c :

uint8_t UTART_BUF[UART_BUF_SIZE];

回調函數

/* USER CODE BEGIN 1 */

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

{

         if(&huart->Instance==&huart1.Instance)

         {

         BaseType_t xHigherPriorityTaskWoken;  

         xHigherPriorityTaskWoken = pdFALSE;   

         xQueueSendToBackFromISR(myQ01Handle,&UTART_BUF,&xHigherPriorityTaskWoken);

         HAL_UART_Receive_IT(huart,UTART_BUF,UART_BUF_SIZE);

         portYIELD_FROM_ISR(xHigherPriorityTaskWoken);       

         }

}

/* USER CODE END 1 */

在主程序初始化時加入:

HAL_UART_Receive_IT(huart,UTART_BUF,UART_BUF_SIZE);

 

Step2:串口接收隊列

創建深度爲128,每列一個字節的隊列,可以通過Cubemx直接配置。這裏要注意由於2個串口採用相同的波特率,因此如果隊列深度設置太小會發生丟數據的情況。

  /* Create the queue(s) */

  /* definition and creation of myQ01 */

  osMessageQDef(myQ01, 128, uint8_t);

  myQ01Handle = osMessageCreate(osMessageQ(myQ01), NULL);

在轉發線程中加入一下代碼:

/* USER CODE END Header_StartTask02 */

void StartTask02(void const * argument)

{

  /* USER CODE BEGIN StartTask02 */

         osEvent osevent;

 

  /* Infinite loop */

  for(;;)

  {

                  osevent= osMessageGet( myQ01Handle,osWaitForever);

                   if(osevent.status==osEventMessage)

                   {

                            HAL_UART_Transmit(&huart2, (uint8_t *)&osevent.value.v, UART_BUF_SIZE,0xFFFF); //將收到的信息發送出去

                                               HAL_UART_Receive_IT(&huart1, (uint8_t *)&UTART_BUF, UART_BUF_SIZE);   //再開啓接收中斷

                   }

  }

  /* USER CODE END StartTask02 */

}

注:紅色部分是添加的代碼。

 

Step3:驗證

編譯後,下載運行。打開2個串口工具一個發數據,另一個接收數據。嘗試512個字節一次發送,沒有丟數據的現象。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章