使用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函數就可以向串口發送消息了