用HAL库改写江科大的stm32入门例子_9-2 利用中断进行串口通讯

电路和 《用HAL库改写江科大的stm32入门例子_9-1》一致。

我们在whlie循环当中,不断查询端口,获取数据,存放到一个数组当中,同时回显给电脑上。这种方法耗费cpu,还是用中断进行串口通讯更合理。

编写用户代码

配置完成后,重新生成代码,打开生成的代码,在main.c文件的用户变量去建立串口接收缓冲区数组。

 找到主函数,在while语句之前,开始通过串口中断接收数据。
  HAL_UART_Receive_IT(&huart1, (uint8_t*)data, sizeof(data));
  这句话的意思是以中断的方式从串口1接收数据,接收道到的数据存在data数组中,每次接收2个字节。 

ps:STM32CubeMX系列教程4:基本串行通信

上个结果图:

注意串口中断回调函数中,要判断串口的来源,因为所有串口中断都用这个回调函数,同时要注意,在这个回调函数中重新开启中断接收。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
  	if(huart->Instance == USART1)   //判断中断是否来自于串口1
	{
		HAL_UART_Transmit_IT(&huart1,(uint8_t*)rx_data,2);  //将接收到的数据通过中断的方式发送出去
		HAL_UART_Receive_IT(&huart1,(uint8_t*)rx_data,2);	//开始接收下一轮数据
	}
}

其他不赘述。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对STM32G4HAL库串口空闲中断接收不定长数据的问题,可以按照以下步骤进行解决: 1. 开启串口空闲中断,即在初始化串口时,将USART_CR1_REG中的USART_CR1_IDLEIE位设置为1。 2. 在串口空闲中断中,通过读取USART_ISR_REG寄存器中的位USART_ISR_RXNE和USART_ISR_IDLE来判断是接收到数据还是空闲中断。 3. 如果是接收到数据,则读取USART_RDR_REG寄存器中的数据,并将其存储到缓冲区中。 4. 如果是空闲中断,则通过计算接收到的数据长度来确定数据的长度,并将其存储到缓冲区中。 5. 在数据长度达到预定长度时,可以通过回调函数或者其他方式来通知数据接收已经完成。 下面是一个示例代码: ```c uint8_t rx_buffer[100]; uint8_t rx_counter = 0; uint8_t rx_length = 0; uint8_t rx_flag = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USARTx) { if(rx_flag == 0) { //接收到数据 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == RESET)) { rx_buffer[rx_counter++] = (uint8_t)(huart->Instance->RDR & 0x00FF); } //空闲中断 else if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET) { rx_length = rx_counter; rx_counter = 0; rx_flag = 1; } } } } ``` 在上面的代码中,当接收到数据时,将数据存储到缓冲区中,并将计数器rx_counter加1。当空闲中断发生时,计算接收到的数据长度,并将其存储到rx_length中。在接收完成后,将rx_flag设置为1,表示数据接收已经完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值