(HAL./LL库)如何同时进行发送串口与接收串口

使用HAL库时无法完成串口同时接收与发送,经过查找资料,发现还有一个LL库可以使用

1.在CubeMX上修改为LL库

(HAL./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函数就可以向串口发送消息了

 

上一篇:Android应用之——最新版本SDK V2.4实现QQ第三方登录


下一篇:2021-11-18 发动机参数