首页 > 其他分享 >switch、case语句的问题

switch、case语句的问题

时间:2024-08-12 10:16:35浏览次数:6  
标签:case 语句 cout ComDevice std switch pInstance IDC

switch、case语句:

点击查看代码
int state = 1;
switch(state)
{
  case 1:
  {
  //状态1执行的程序
  }
  case 2:
  {
  //状态2执行的程序
  }
  defalt:
  {
  //默认执行的程序
  }
}

在工作过程当中的一个switch case语句为:

点击查看代码
UINT CCS2X90_HHU_DirectUpgradeDlg::UpgradeThread(LPVOID pParam)
{
	std::string logFilePath = "C:\\Users\\Administrator\\Desktop\\项目文件\\BootLoader 错误注入测试项目\\上位机源码\\CS2X90_HHU_DirectUpgrade\\Fault_Injection_Test_Log.txt";
	std::ofstream logFile(logFilePath);
	if (!logFile.is_open())
	{
		std::cerr << "无法打开日志文件: " << logFilePath.c_str() << std::endl;
	}
	TeeStream teeStream(std::cout, logFile);

	BOOL m_IsUpgrading = TRUE;
	UpgradeState_For_HHU_Device state = HHU_COM_TEST_STAGE_GET_BIOS;

	BYTE Cmd[10] = { 0 };
	BYTE rbuf[50] = { 0 };
	BYTE UpgradeStep = 0;
	UINT16 rcr_result = 0;
	UINT rLen = 0, tryCnt = 0;
	UINT preTime = 0;
	CString VersionStr = "";
	UINT32 frameSending = 0;
	UINT8 Data[258] = { 0 };
	BOOL CS3290_rflag = FALSE;
	CCS2X90_HHU_DirectUpgradeDlg* pInstance = (CCS2X90_HHU_DirectUpgradeDlg*)pParam;


	while (m_IsUpgrading)
	{
		//std::cout << "开始外循环" << std::endl;

		//用于检测串口设备是否开启,只会在程序开始前执行一次,之后程序就会卡在while (m_ThreadRunFlag)当中了
		if (m_ThreadRunFlag)
		{
			std::cout << "正在检测串口设备是否开启" << std::endl;
			if (!pInstance->m_ComDevice.OpenDevice(pInstance->m_PortName, 115200))
			{
				std::cout << "串口设备开启失败" << std::endl;
				pInstance->AddToInfOut(pInstance->m_Info.OpenDeviceErrorInfo());
				pInstance->GetDlgItem(IDC_COMBO_PORTNAME)->EnableWindow(TRUE);
				pInstance->GetDlgItem(IDC_BUTTON_UPGRADE)->EnableWindow(TRUE);
				return 0;
			}
			std::cout << "串口设备开启成功" << std::endl;
		}


		//开始进行升级循环
		while (m_ThreadRunFlag)
		{
			//std::cout << "开始内循环" << std::endl;

			//只要任意条件满足,则进行读取设备上发数据的操作
			//在此处不断的读取数据到rbuf当中,用于后续的判断
			if ((m_IsCS3290 == FALSE) || (CS3290_rflag == TRUE))
			{
				memset(rbuf, 0, sizeof(rbuf));
				do
				{
					std::cout << "读取设备返回数据" << std::endl;
					rLen = pInstance->m_ComDevice.ReadDevice(rbuf, 1);
					if ((UpgradeStep == 6) && (((GetTickCount() - preTime) > 30000) || (rLen != 0)))
						break;
				} while (UpgradeStep == 6);
			}
			//如果任意条件都不满足
			else
			{
				if (UpgradeStep == 0)
				{
					std::cout << "正在判断上位机控件选择的升级模式" << std::endl;
					if (((CButton*)pInstance->GetDlgItem(IDC_RADIO_LOADER))->GetCheck())
					{
						Cmd[0] = RS232_UPGRADE_HHUINT_LDR;
						std::cout << "选择了Lodaer升级模式" << std::endl;
					}
					else if (((CButton*)pInstance->GetDlgItem(IDC_RADIO_APP))->GetCheck())
					{
						Cmd[0] = RS232_UPGRADE_HHUINT_APP;
						std::cout << "选择了APP升级模式" << std::endl;
					}

					std::cout << "发送升级模式指令" << std::endl;
					pInstance->m_ComDevice.WriteDevice(Cmd, 1);
					UpgradeStep = 1;
					CS3290_rflag = TRUE;
					continue;
				}
			}

			//程序状态进行回滚,将升级流程恢复到初始状态
			if (m_IsCS3290 == FALSE && pInstance->m_AutoUpgrade == FALSE && flag == TRUE && UpgradeStep == 0)
			{
				std::cout << "程序状态进行回滚,将升级流程恢复到初始状态" << std::endl;
				flag = FALSE;
				pInstance->GetDlgItem(IDC_COMBO_PORTNAME)->EnableWindow(TRUE);
				pInstance->GetDlgItem(IDC_BUTTON_UPGRADE)->EnableWindow(TRUE);
				pInstance->m_File.CloseFile();
				pInstance->m_ComDevice.SetBaudRate(115200);
				pInstance->m_ComDevice.CloseDevice();
				return 0;
			}


			switch (state)
			{

				//获取BIOS信息
				case HHU_COM_TEST_STAGE_GET_BIOS:
				{
					std::cout << "开始进行获取BIOS的阶段" << std::endl;
					switch (rbuf[0])
					{
						case RS232_UPGRADE_RQ: // 处理升级请求, //最开始的升级步骤为0
						{
							if (UpgradeStep == 0)
							{
								std::cout << "收到了“0x05”且升级流程状态为0" << std::endl;
								std::cout << "发送“0x06”,用以回应设备" << std::endl;
								Cmd[0] = RS232_UPGRADE_CF;
								pInstance->m_ComDevice.WriteDevice(Cmd, 1);
								Sleep(500);

								std::cout << "开始根据上位机选择的升级模式发送对应的指令" << std::endl;
								if (((CButton*)pInstance->GetDlgItem(IDC_RADIO_LOADER))->GetCheck())
								{
									Cmd[0] = RS232_UPGRADE_HHUINT_LDR;
									std::cout << "选择Loader模式,发送“0xAA”" << std::endl;
								}
								else if (((CButton*)pInstance->GetDlgItem(IDC_RADIO_APP))->GetCheck())
								{
									Cmd[0] = RS232_UPGRADE_HHUINT_APP;
									std::cout << "选择APP模式,发送“0xBB”" << std::endl;
								}

								pInstance->m_ComDevice.WriteDevice(Cmd, 1);

								if ((pInstance->m_AutoUpgrade) && (m_IsCS3290 == FALSE))
								{
									pInstance->SetDlgItemText(IDC_EDIT_DISPLAY, "");
									pInstance->m_UpgradeProgress.SetPos(0);
									pInstance->m_UpgradeProgress.SetBarColor(RGB(0, 0, 255));
								}
								//设置升级步骤1
								UpgradeStep = 1;
								std::cout << "设置升级步骤1" << std::endl;
							}
							break;
						}

						case RS232_UPGRADE_ACK: // 处理升级应答
						{
							switch (UpgradeStep)
							{
								case 1:
								{
									if (((CButton*)pInstance->GetDlgItem(IDC_RADIO_APP))->GetCheck())
									{
										Sleep(500);
									}
									std::cout << "发送BIOS版本信息查询指令“0x30”" << std::endl;
									Cmd[0] = RS232_REQ_VER;
									pInstance->m_ComDevice.WriteDevice(Cmd, 1);

									rLen = pInstance->m_ComDevice.ReadDevice(rbuf, 30);
									VersionStr += pInstance->m_Info.BiosVersionInfo();
									std::cout << "开始接受BIOS信息" << std::endl;
									for (UINT i = 0; i < rLen; i++)
									{
										VersionStr += rbuf[i];
									}
									std::cout << "BIOS" << (LPCSTR)VersionStr << std::endl;
									std::cout << "-----------------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
									std::cout << "" << std::endl;
									teeStream << "【Bootloader Upgrade(Fault Injection Test)测试】" << std::endl;
									teeStream << "无线串口RS232快速升级" << std::endl;
									teeStream << "BIOS" << (LPCSTR)VersionStr << std::endl;
									teeStream << "-----------------------------------------------------------------------------------------------------------------------------------------------------------" << std::endl;
									teeStream << "" << std::endl;
									pInstance->AddToInfOut(VersionStr + "\r\n");
									UpgradeStep = 0;
									state = HHU_COM_NORMAL_STAGE_1;
									std::cout << "state状态变化为HHU_COM_NORMAL_STAGE_1" << std::endl;
									Sleep(20000);
									break;
								}
						}
						break;
					}

						default: // 当 rbuf[0] 不匹配任何 case 时执行
						{
							std::cout << "未收到预期的返回数据,保持状态为 HHU_COM_TEST_STAGE_GET_BIOS" << std::endl;
							state = HHU_COM_TEST_STAGE_GET_BIOS;
							break;
						}
					} //end of "switch (rbuf[0])"
					break;
				}//end of "case HHU_COM_TEST_STAGE_GET_BIOS:"


				//明明没有满足这个条件,但是还是会自动执行到HHU_COM_TEST_STAGE_1这个状态

				//测试阶段1,此处属于握手阶段的异常测试项,发送“0xFF”,等待2分钟,只要设备没有任何响应就是符合预期的现象。此时通过上位机窗口提升用户重启设备进行之后的测试
				case HHU_COM_TEST_STAGE_1:
				{

					std::cout << "测试阶段1:握手阶段异常测试,发送“0xFF”,等待2分钟,只要设备没有任何响应就是符合预期的现象。此时通过上位机窗口提升用户重启设备进行之后的测试" << std::endl;

					
				}


				//正常阶段1,一直顺序执行,直到测试项来到设置设备的波特率
				case HHU_COM_NORMAL_STAGE_1:
				{
					std::cout << "正常阶段1" << std::endl;
				}



			}	//end of switch


		}	//end of "while (m_ThreadRunFlag)" 内循环




	}//end of "while (m_IsUpgrading)" 外循环

	return 0;
}

其中case HHU_COM_TEST_STAGE_GET_BIOS:中的switch在实际编写的过程当中出了问题,如果需要跳出这个case语句,其中的break需要放在case语句最外层括号的内部,具体如下:

点击查看代码
//获取BIOS信息
				case HHU_COM_TEST_STAGE_GET_BIOS:
				{
					std::cout << "开始进行获取BIOS的阶段" << std::endl;
					switch (rbuf[0])
					{
						case RS232_UPGRADE_RQ: // 处理升级请求, //最开始的升级步骤为0
						{
							
							break;
						}

						case RS232_UPGRADE_ACK: // 处理升级应答
						{
							switch (UpgradeStep)
							{
								case 1:
								{
									break;
								}
							}
						break;
						}

						default: // 当 rbuf[0] 不匹配任何 case 时执行
						{
							std::cout << "未收到预期的返回数据,保持状态为 HHU_COM_TEST_STAGE_GET_BIOS" << std::endl;
							state = HHU_COM_TEST_STAGE_GET_BIOS;
							break;
						}
					} //end of "switch (rbuf[0])"
					break;
				}//end of "case HHU_COM_TEST_STAGE_GET_BIOS:"

这样才是正确的

标签:case,语句,cout,ComDevice,std,switch,pInstance,IDC
From: https://www.cnblogs.com/Vsonic12138/p/18354405

相关文章

  • 4.5.Switch Security
    switchsecurity(交换安全)maclayerattacks(mac地址攻击)mac地址泛红变换mac让交换机不停学习,占满mac地址表,其他pc发送报文就进行泛红。portsecurity(端口安全)1未授权mac地址2mac地址个数限制(默认1个)3采取措施switch(config-if)#switchportport-security[maximumvalue]......
  • switch和try-catch综合练习
    //输入任意年份,月份,判断该月份天数;staticvoidMain(string[]args){intintDay=0;intintYear=0;intintMonth=0;//任意输入年份和月份,判断该月有几天;try......
  • FreeSWITCH对接http协议的tts服务
    操作系统:CentOS7.6_x64FreeSWITCH版本:1.10.9 FreeSWITCH里面有个mod_tts_commandline模块,可以用来对接http协议的tts服务,今天整理下这方面的笔记,并提供相关演示效果及资源下载。我将从以下几个方面进行展开:自建tts服务模拟测试环境编译及配置mod_tts_commandl......
  • switch_case练习
     staticvoidMain(string[]args){doubleintSalary=5000;boolbFlag=true;Console.WriteLine("请输入张三的评点等级:");stringstrLevel=Console.ReadLine();switch(strLevel......
  • 使用条件语句登录QQ(Pythonn实验实训项目)
    实验目的1、掌握变量的创建方法及变量赋值运算的使用方法;2、掌握的掌握if-elif--else条件语句和循环语句的嵌套使用;3、掌握比较运算符的应用;4、掌握输入语句的使用方法;5、掌握continue和break语句的用法。二、实验内容使用条件语句实现QQ登录:若用户名和密码都输入正确,则......
  • Python之赋值语句(多重赋值和交换赋值)
    这是《Python入门经典以解决计算问题为导向的Python编程实践》73-74页关于赋值的内容。讲了Python中几种赋值方式。赋值语句1、最简单的赋值:a=b2、多重赋值:a,b,c=1,2,33、交换:a,b=b,a1、最简单的赋值:a=bb可以是数字、字符串,也可以是一个表达式。a必须是一个对象,不......
  • 【第1篇】mysql语句大全及用法
    【第1篇】mysql语句大全及用法【第1篇】mysql语句大全及用法1.创建数据库2.选择数据库3.创建数据表4.插入数据5.查询数据6.更新数据7.删除数据8.修改数据表结构10.删除索引11.创建视图12.删除视图13.创建存储过程14.调用存储过程15.创建触发器17.备份数据......
  • openai 的各个模型比较(关于英语句子解析)
    最近在使用chatgpt帮助学习英语,主要是进行语法分析和难点解释。为了找到最适合的模型,我比较了多个模型的回答。语法分析问题这是我在实际中理解有困难的句子,尽管比较简短,但从内容上理解,它涉及了倒装。各个模型回答gpt-3.-5-turbo-1106是经过微调的3.5-turbogpt-4o-m......
  • Sql语句出现ORA-00933: SQL command not properly ended的解决方法
    目录1.问题所示2.原理分析3.解决方法1.问题所示执行sql语句的时候出现如下问题:ORA-00933:SQLcommandnotproperlyended截图如下所示:2.原理分析ORA-00933:SQLcommandnotproperlyended是Oracle数据库中的错误,指示SQL语句存在语法问题MyS......
  • R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和
    R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和标准差等)、编写自定义日期格式化(format)函数(switch函数使用不同分枝格式化日期数据)、应用自定函数目录R语言用户自定义函数的语法结构、编写自定义统计值计算函数(使用ifelse结构计算均值和......