新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2021-2-26
- 在线时间
- 3 小时
|
1金钱
最近在学习DMA空闲中断接收串口数据时编写了一段程序。基本思路是空闲中断接收数据,判断数据长度,长度小于7时,将一个标志位加1,标志位加到10时发送报错信息,若中间出现一次数据位长度为7,则将标志位清零。
在编写程序后出现了问题,如果初始数据长度小于7,即使后续数据输入长度为7,也无法清除标志位。通过debug发现是len这个变量只保留第一次的数据,如果注释掉if(len!=7)后面的语句就没有问题。不知道是什么原因,有没有大佬帮忙看一下!
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET) //判断是否触发空闲中断
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2); //清除中断标志位;
HAL_UART_DMAStop(&huart2); //暂时关闭DMA传输;
len=7-__HAL_DMA_GET_COUNTER(huart2.hdmarx); //得到接收字节长度;
if(len != 7)
{
error_flag1 = error_flag1 +1;
if(error_flag1 == 10) //如果连续10次数长均有错误,则向上报错!
{
uint8_t error_data[11] = "CH1_Len_Err";
HAL_UART_Transmit_DMA(&huart1,error_data,11); //输出故障报错“长度错误!”
HAL_Delay(1);
HAL_UART_Receive_DMA(&huart2,input,7);
error_flag1 = 0;//清除数长错误标志位
}
else
{}
}
else
{
//如果长度不小于7,进行数据处理
error_flag1 = 0; //清零数长错误标志位
HAL_UART_Transmit_DMA(&huart1,input,len);
HAL_Delay(1);
HAL_UART_Receive_DMA(&huart2,input,7);
}
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
/**
|
最佳答案
查看完整内容[请看2#楼]
接收完 加标志位。然后在主循环判断该标志。然后进行处理。不要在中断里又加延时 又加发送的, 一堆问题。
|