javarxtx串口接收时数据会多段打印_UART IDLE 中断使用接收不定长串口数据

前言

在串口通信应用中,我们常使用接受和发送中断,相信大家都不陌生。这里有个非常有用的中断可能被大家所忽略,即总线IDLE中断。当一帧数据传输结束之后,总线会维持高电平状态,此时,就可以触发MCU的IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却很多用于检测数据传输是否完成的判断动作。

实验环境

  • STM32F411RE-NUCLEO

  • STM32CubeMX

总线状态分析

下图是发送0xAA 0x55的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,数据线处于IDLE的状态。在该帧中,字节与字节之间,没有IDLE状态出现,即不会出现IDLE误触发的情况。

4250a5f502dc65ae1e59bf5bbb21bc91.png

不定长数据接收

本次制作的工程是基于HAL库。在原生的HAL库中,并没有集成IDLE中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。

使用STM32CubeMX生成实验工程

工程的配置如下图:

1.系统始终配置为100MHz

2.配置USART2为Asynchrones,管脚配置为PA2,PA3。

3.USART2参数:9600Bits/s, 8bits, None, 1Stop

4449246d3e9c80b61110504ba92bd5b0.png

9dcb627e854fc69c9d7b05d3f00ba19f.png

为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射print函数。

main.c-声明

f437ae593df8da47d9106e1ea8d05086.png

main.c-Code

78b0c2bd00f9fa3f41c44e75c92a2852.png

修改工程代码

增加接收Buffer

main.c

9f7652d52050ebefee7680ccf6859b0f.png

stm32f4xx_hal_uart.c

003e606ee19ca37fc6962bf9b0aa9cea.png

在接收函数中使能IDLE中断

stm32f4xx_hal_uart.c  HAL_UART_Receive_DMA()函数

69a1eec68163e133bd08d78532c62ee9.png

处理IDLE中断

stm32f4xx_hal_uart.c  HAL_UART_IRQHandler ()函数

f9f49ea35bdb1adf08d8294de6aaaa3e.png

接收完成处理(IDLE产生,一帧数据传输完成)

stm32f4xx_hal_uart.c  HAL_UART_AbortReceive_IT ()函数

916a40c2c511d35f18e063341898a2c4.png

main.c

75ec7100040badce9b07f53b8a8019f8.png

使能接收

main.c

b38081b4b65c7d2bb6e31424d4ad02ac.png

实验结果

使用串口调试串口,通过STLINK的虚拟串口发送数据,MCU会返回接收多少个字节的数据,并将接收到的数据打印出来。下图是发送0xAA 0x55的实验结果。

fd0b475617412f96cd0a23cd9cbc472c.png

小结

IDLE作为指示总线空闲状态的中断,合理的使用能够很大程度的节省代码程序设计工作量。这里只是做个简单示范,抛砖引玉,实际应用中希望大家可以灵活使用满足所需。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用STM32的串口空闲中断和DMA可以实现接收不定数据的功能,具体步骤如下: 1. 配置串口和DMA 首先需要配置串口和DMA,使其能够正常工作。具体配置方法可以参考STM32的官方文档或者其他相关资料。 2. 配置接收数组和接收计数器 在代码中定义一个接收数组和一个接收计数器,用于存储接收到的数据和记录接收到的数据度。 3. 配置空闲中断 在空闲中断中判断接收数据是否完成,如果完成则将接收到的数据发送出去。具体实现方法如下: ```c void HAL_UART_IDLECallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { uint32_t tmp_flag = 0; uint32_t temp; tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE); //获取空闲中断标志 if((tmp_flag != RESET)) //判断是否是空闲中断 { __HAL_UART_CLEAR_IDLEFLAG(&huart1); //清除空闲中断标志 HAL_UART_DMAStop(&huart1); //停止DMA传输 temp = huart1.hdmarx->Instance->CNDTR; //获取DMA缓存区剩余数据uart1_rx_len = UART_RCV_BUF_SIZE - temp; //计算接收到的数据度 HAL_UART_Transmit(&huart1, uart1_rx_buf, uart1_rx_len, 0xffff); //将接收到的数据发送出去 HAL_UART_Receive_DMA(&huart1, uart1_rx_buf, UART_RCV_BUF_SIZE); //重新开启DMA传输 } } } ``` 4. 启动DMA传输 在代码中启动DMA传输,将串口接收到的数据存储到接收数组中。具体实现方法如下: ```c HAL_UART_Receive_DMA(&huart1, uart1_rx_buf, UART_RCV_BUF_SIZE); ``` 以上就是使用STM32的串口空闲中断和DMA实现接收不定数据的方法。如果您有任何问题,请随提出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值