STM32 HAL 串口收发(无DMA,中断接收)
STM32CUBE配置
一、使用printf发送数据,在usart.c中添加代码串口重定向
/* USER CODE BEGIN 0 */
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);//注意把&huart1改为自己的stm32使用的串口号
return ch;
}
/* USER CODE END 0 */
while (1)
{
/* USER CODE END WHILE */
ch=2345.1234;
printf("%.2f
",ch);
HAL_Delay(1000);
/* USER CODE BEGIN 3 */
}
二、中断接收数据
在main函数中添加串口中断函数
/* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);//开串口中断 /* USER CODE END 2 */
定义变量接收数据
/* USER CODE BEGIN Includes */ #define RXBUFFERSIZE 256 //最大接收字节数 char RxBuffer[RXBUFFERSIZE]; //接收数据 uint8_t aRxBuffer; //接收中断缓冲 uint8_t Uart1_Rx_Cnt = 0; //接收缓冲计数 /* USER CODE END Includes */
在用户代码中添加中断接收解析代码
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
if(Uart1_Rx_Cnt >= 255) //溢出判断
{
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}
else
{
RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存
if((RxBuffer[Uart1_Rx_Cnt-1]==0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2]==0x0D))//判断结束位
{
if(RxBuffer[0] == A)//串口数据开头,检测是否是需要的数据,开头为A则让灯取反
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_15); //取反
}
Uart1_Rx_Cnt = 0;
memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断
}
/* USER CODE END 0 */
