STM32CubeIDE串口空闲中断实现不定长数据接收
2023-12-15 17:34:30
目的
在串口输入不定长数据时,通过串口空闲中断来断帧接收数据。
编程软件
STM32CubeIDE
STM32CubeMX配置MCU。通过对端口配置,自动生成程序,减少编程量。
配置串口开中断
配置串口打开中断有两条指令,可以将这两条指令放在:
static void MX_USART1_UART_Init(void)下面,注意,还是要放在用户代码段,这样再重新生成C/C++软件时不会被清除。
/* USER CODE BEGIN USART1_Init 2 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);//接收中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//空闲中断
/* USER CODE END USART1_Init 2 */
中断程序
在stm32f0xx_it.c文件下找到void USART1_IRQHandler(void),在其中的用户代码段中添加:
/* USER CODE BEGIN USART1_IRQn 0 */
//接收中断
uint8_t rxData = 0;
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
{
HAL_UART_Receive(&huart1, &rxData, 1, 1000);
if(Cnt < 256)
{
rx_buff[Cnt] = rxData;
Cnt++;
}
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_RXNE);
}
// 空闲中断
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
{
//一帧数据接收完成
USART1_IdleCallback(rx_buff, Cnt);
Cnt = 0;
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
}
/* USER CODE END USART1_IRQn 0 */
// 此处是原来已经有的程序,保留:
HAL_UART_IRQHandler(&huart1);
接着在这一部分的程序下面添加回调函数:
/* USER CODE BEGIN 1 */
//回调函数
void USART1_IdleCallback(uint8_t *pData,uint16_t len)
{
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC) != SET);
HAL_UART_Transmit(&huart1, pData, len, 1000);
}
/* USER CODE END 1 */
这一部分执行将串口输入的数据回显输出到串口。
运行结果
碰到的问题
当波特率为2.5Mbps时,问题就出现了,发送字符没有问题,但设备返回的字节用中断和空闲接收都不起作用了。用定长接收,收到一定的次数就会停止,不接收了,但监视看字节还是在进行,只是我们的接收停止了。哪位高手能指点一下。谢谢!
文章来源:https://blog.csdn.net/weixin_44481398/article/details/134894292
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!