(HAL./LL庫)如何同時進行發送串口與接收串口


使用HAL庫時無法完成串口同時接收與發送,經過查找資料,發現還有一個LL庫可以使用

1.在CubeMX上修改為LL庫

 2.定義變量與顯示

unsigned char UART1_Rx_Buf[MAX_REC_LENGTH] = {0}; //USART1存儲接收數據
unsigned char UART1_Rx_flg = 0;                   //USART1接收完成標志
unsigned int  UART1_Rx_cnt = 0;                   //USART1接受數據計數器
unsigned char UART1_temp[REC_LENGTH] = {0};       //USART1接收數據緩存

 if(UART1_Rx_flg)
    {
    //OLED顯示接收數據 ssd1306_SetCursor(
0,0);//x,y坐標 ssd1306_WriteString((char *)UART1_Rx_Buf,Font_7x10, White); ssd1306_UpdateScreen(); for(int i = 0;i<UART1_Rx_cnt;i++) UART1_Rx_Buf[i] = 0; UART1_Rx_cnt = 0; UART1_Rx_flg = 0; }

3.在stm32f1xx_it.c中添加

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    if(LL_USART_IsActiveFlag_RXNE(USART1)) //檢測是否接收中斷
    {
        UART1_temp[0]=LL_USART_ReceiveData8(USART1);   //讀取出來接收到的數據
        if( UART1_temp[0]== '\r'||UART1_temp[0]== 0x0a)
        {
            UART1_Rx_cnt=0;
            UART1_Rx_flg=1;
        }
        else
        {
            UART1_Rx_flg=0;
            UART1_Rx_Buf[UART1_Rx_cnt]=UART1_temp[0];
            UART1_Rx_cnt++;
        }
    //    LL_USART_TransmitData8(USART1,Rx);  //把數據再從串口發送出去     
    }
  /* USER CODE END USART1_IRQn 0 */
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

4.在stm32f1xx_it.h中添加

#define REC_LENGTH  1
#define MAX_REC_LENGTH  1024 

5.在usart.c中添加

/* USER CODE BEGIN 1 */
//定義printf函數
int fputc(int ch, FILE *f)
{ 
  while(LL_USART_IsActiveFlag_TC(USART1)!=1);
    LL_USART_TransmitData8(USART1,(uint8_t)(ch & (uint8_t)0xff));
    while(LL_USART_IsActiveFlag_TC(USART1)!=1);
    return ch;
}
/* USER CODE END 1 */

到此以完成全部配置,且使用printf函數就可以向串口發送消息了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM