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