[求助] 关于串口接收中断函数有一个bug是什么原因导致?

xbxdbd   2024-10-22 16:53 楼主
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	uint8_t ucTemp;

	if(huart ->Instance == USART1)
    {
				ucTemp = aRxBuffer;
				Uart1_RxBuff[Uart1_Rx_Cnt++] = ucTemp;
				if(Uart1_RxBuff[0]!=0xa3  )
				{
					Uart1_Rx_Cnt=0;
        	memset(Uart1_RxBuff, 0, sizeof(Uart1_RxBuff)); // 清空接收缓冲区
					// 如果数据格式错误或数据测试失败,发送“ERROR”
					char error[] = "ERROR1\r\n";
					HAL_UART_Transmit(&huart1, (uint8_t*)error, strlen(error), 1000);
//					globalError =1;
//					HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);
//            return;
				}
        
				 // 检查是否是脉冲数指令
			 if (Uart1_Rx_Cnt == 4&& Uart1_RxBuff[0] == 0xA3&&Uart1_RxBuff[1] == 0x5a) 
					{
						   
								if (data_test1(Uart1_RxBuff) ) 
							 {
												targetPulses =
																			((int16_t)Uart1_RxBuff[2] << 8)  |
																			 (int16_t)Uart1_RxBuff[3];
										  
								}      
								else
									{
										      
										      targetPulses=0;
													// 如果数据格式错误或数据测试失败,发送“ERROR”
													char error[] = "ERROR4\r\n";
													HAL_UART_Transmit(&huart1, (uint8_t*)error, strlen(error), 1000);
													memset(Uart1_RxBuff, 0, sizeof(Uart1_RxBuff));
													Uart1_Rx_Cnt = 0;
													// 在发送完ERROR后,检查接收缓冲区是否已清空,如果清空则重新启动接收中断
													HAL_UART_Receive_IT(&huart1, &aRxBuffer, 1);//重新接受

													
									}
									
							Uart1_Rx_Cnt = 0;

					}
															
	     HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);	
					
		}
		
}

串口基本上指令都能完成 假如我发送A3 5A 4C 59 C3,不管我在59后面添加多少个字节,都是收到error1的错误指令,电机还能转动;我看Uart1_RxBuff【0】是C3;targetPulses是4c59;所以这种BUG我应该怎么避免,软件上逻辑哪里还需要添加或者修改的呢

本帖最后由 xbxdbd 于 2024-10-22 17:03 编辑

回复评论 (2)

确定是串口接收中断函数有一个bug么

 

点赞  2024-10-23 07:27
引用: Jacktang 发表于 2024-10-23 07:27 确定是串口接收中断函数有一个bug么  

?我的串口中断函数写的有问题?因为我测试基本的这个3个功能都能实现,就是会出现如果末尾添加多个字节,会被执行,并且会收到error1

点赞  2024-10-23 12:51
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复