【STM32】HAL库 串口中断发送与接收

本文详细介绍了如何在STM32中使用HAL库进行串口的中断发送字符串、数组和不定长字符串接收,包括设置步骤、代码示例及中断处理函数。
摘要由CSDN通过智能技术生成

系列文章目录

【STM32】HAL库 新建MDK工程
【STM32】HAL库 串口轮询发送


前言

使用stm32串口中断发送和中断接收

一、STM32CubeMX设置

使能串口中断

二、代码

中断发送字符串

void Serial_SendString(char *String)
{
		HAL_UART_Transmit_IT(&huart1,(uint8_t *)String,strlen(String));
}

中断发送数组

void Serial_SendArray(uint8_t *Array, uint16_t Length)
{
		HAL_UART_Transmit_IT(&huart1,Array,Length);
}

主函数

/* USER CODE BEGIN PV */
char String[] = {"hello world\r\n"};
uint8_t Tarr[7] = {0x77,0x6F,0x72,0x6C,0x64,0x0D,0x0A};
/* USER CODE END PV */

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		 Serial_SendString(String);
		 HAL_Delay(1000);
		
		 Serial_SendArray(Tarr, sizeof(Tarr)/sizeof(Tarr[0]));
     	 HAL_Delay(1000);
  }
    /* USER CODE END 3 */

在这里插入图片描述

中断接收

在主函数前开启中断,接受字节数为5

uint8_t Rarr[5] = {0};

HAL_UART_Receive_IT(&huart1,Rarr,5);

接受5个字节后,进入中断接收完成回调函数,重新再开启中断,并把接收到的数据返回

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	HAL_UART_Receive_IT(&huart1,Rarr,5);
  Serial_SendArray(Rarr,sizeof(Rarr)/sizeof(Rarr[0]));
}

在这里插入图片描述

不定长字符串接收

修改接收数组长度,改为开启串口空闲中断

uint8_t Rarr[50] = {0};

HAL_UARTEx_ReceiveToIdle_IT(&huart1,Rarr,50);

接收事件回调函数

 void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
 {
	   Serial_SendArray(Rarr,Size);
	   HAL_UARTEx_ReceiveToIdle_IT(&huart1,Rarr,50);
 }

在这里插入图片描述

  • 10
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在使用STM32 HAL库进行串口通信时,可以使用中断接收和DMA发送的方式来提高通信效率。 首先需要初始化串口,并配置接收中断和DMA发送。以下是一个示例代码: ``` UART_HandleTypeDef huart1; void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } /* Enable the UART Parity Error Interrupt */ HAL_UART_Receive_IT(&huart1, rxBuffer, 1); /* Enable the DMA transfer for transmit */ HAL_UART_Transmit_DMA(&huart1, txBuffer, strlen((char *)txBuffer)); } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { /* process received data */ HAL_UART_Receive_IT(&huart1, rxBuffer, 1); } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { /* transmit completed */ } } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { /* handle UART error */ } } ``` 在上面的代码中,`USART1`是串口的实例,`rxBuffer`和`txBuffer`是接收发送缓冲区。在串口初始化时,使用`HAL_UART_Receive_IT`函数开启接收中断,并使用`HAL_UART_Transmit_DMA`函数开启DMA发送。在接收中断回调函数`HAL_UART_RxCpltCallback`中,可以对接收到的数据进行处理,并继续接收下一个字节。在发送完成回调函数`HAL_UART_TxCpltCallback`中,可以进行一些操作,例如将发送缓冲区中的数据更新,等待下一次发送。在出现UART错误时,`HAL_UART_ErrorCallback`函数会被调用,可以在该函数中处理错误。 需要注意的是,在使用DMA发送时,需要保证发送缓冲区的数据不会被修改,直到DMA发送完成。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值