stm32 hal串口的各种使用方式

· 更新于

stm32串口

21.10.15

0,重映射

`#include <stdio.h> void lb_uart_sendbyte(uint8_t *str) { 	HAL_UART_Transmit(&huart1,str,1,1000); } void lb_uart_sendstring(uint8_t *str) { 	unsigned int k=0;   do    {       HAL_UART_Transmit(&huart1,(uint8_t *)(str + k) ,1,1000);       k++;   } while(*(str + k)!='\0'); } int fputc(int ch, FILE *f) { 	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);	 	return (ch); } int fgetc(FILE *f) {		 	int ch; 	HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);	 	return (ch); }`

1,使用串口接收中断方式,接收固定长度字符,以指定字符开头,且以指定字符结尾

如:FD 31 54 0C 01 DF FD 31 54 0C 01 DF

`0,cubemx中配置串口为ASYNC,且开启串口中断  1,mian.c中定义全局变量 #define uart1_rev_size 6 uint8_t uart1_rev_buf[6]={0x00};  uint8_t uart1_rev_onebyte [1]={0};  2,main.c中main函数的while前调用接收中断 HAL_UART_Receive_IT(&huart1,uart1_rev_onebyte,1);  3,while中执行用户逻辑  4,main.c的最后放接收中断完成回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { 	if(huart==&huart1) 	{ 	      static uint8_t USART1_Receive_buff[uart1_rev_size]={0x00};  				static uint8_t Uart1_Receive_Number=0;//一次性接收了多少个数据 				static uint8_t Uart1_Receive_enable=0;//是否使能接收数据 			 				if(uart1_rev_onebyte[0]==0xFD )//如果收到了帧头: 				{ 					Uart1_Receive_enable=1;	//使能接收 					Uart1_Receive_Number=0;//从第零位开始接收。 					memset(USART1_Receive_buff, 0, sizeof(USART1_Receive_buff));//清空接收区数据 				} 				else if(uart1_rev_onebyte[0]==0xDF && Uart1_Receive_Number==uart1_rev_size-1)//如果收到了帧尾,并且数据长度正常。 				{ 					USART1_Receive_buff[Uart1_Receive_Number]=uart1_rev_onebyte[0];//将帧尾放进去后,再使能接收 							Uart1_Receive_enable=0;//失能接收 							Uart1_Receive_Number=0;//清零接收位。  							memcpy(uart1_rev_buf,USART1_Receive_buff,sizeof(USART1_Receive_buff)); 					    HAL_UART_Transmit(&huart1,uart1_rev_buf,uart1_rev_size,0xffff); 				} 				if(Uart1_Receive_enable==1)//如果接收被使能,开始接收数据 				{ 					USART1_Receive_buff[Uart1_Receive_Number]=uart1_rev_onebyte[0]; 					Uart1_Receive_Number++; 				} 				HAL_UART_Receive_IT(&huart1, uart1_rev_onebyte, 1);//开启下一次接收中断 	} }`