switch、case语句的问题
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:"
这样才是正确的,即break放在case语句右括号之前
switch、case语句的问题的更多相关文章
- 为什么说在使用多条件判断时switch case语句比if语句效率高?
在学习JavaScript中的if控制语句和switch控制语句的时候,提到了使用多条件判断时switch case语句比if语句效率高,但是身为小白的我并没有在代码中看出有什么不同.去度娘找了半个小 ...
- java中的Switch case语句
java中的Switch case 语句 在Switch语句中有4个关键字:switch,case break,default. 在switch(变量),变量只能是整型或者字符型,程序先读出这个变量的 ...
- switch… case 语句的用法
switch… case 语句的用法 public class Test7 { public static void main(String[] args) { int i=5; switch(i ...
- if语句,if...else if语句和switch...case语句的区别和分析
前段时间在工作中遇到了一个关于条件判断语句的问题,在if语句,if else if语句和switch case语句这三者之间分析,使用其中最有效率的一种方法. 所以就将这个问题作为自己第一篇博客的主要 ...
- Python | 基础系列 · Python为什么没有switch/case语句?
与我之前使用的所有语言都不同,Python没有switch/case语句.为了达到这种分支语句的效果,一般方法是使用字典映射: def numbers_to_strings(argument): sw ...
- 为什么switch...case语句比if...else执行效率高
在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘. 第一步,写一个d ...
- JavaScript基础知识(if、if else、else if、while、switch...case语句)
13.语句 概念:就是分号(:) 代表一条语句的结束 习惯:一行只编写一条语句:一行编写多条语句(代码可读性较差) 语句块:可以包含多条语句 "{ }"将多条语句包裹 u ...
- C语言中switch case语句可变参实现方法(case 参数 空格...空格 参数 :)
正常情况下,switch case语句是这么写的: : : ... ;break ; default : ... ;break ; } 接下来说一种不常见的,但是对于多参数有很大的帮助的写法: 先给一 ...
- Java基础之循环语句、条件语句、switch case 语句
Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: whi ...
- python技巧 switch case语句
不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y): ...
随机推荐
- CRC算法原理、推导及实现
CRC, Cyclic Redundancy Check, 循环冗余校验 1. 基本原理 CRC的本质是除法,把待检验的数据当作一个很大(很长)的被除数,两边选定一个除数(有的文献叫poly),最后得 ...
- JavaScript设计模式样例二十一 —— 解释器模式
解释器模式(Interpreter Pattern) 定义:提供了评估语言的语法或表达式的方式.目的:对于一些固定文法构建一个解释句子的解释器.场景:编译器.运算表达式计算. // 定义对于语法的断言 ...
- 为什么用Vite框架?来看它的核心组件案例详解
Vite 是一个前端构建工具,它以其快速的开发服务器和生产优化的打包器而闻名前端界,今天的内容,必须得唠唠 Vite 的关键能力,以下是 Vite 的核心组件分析,以及使用案例: 原理分析: Vite ...
- OBS直播抠绿插件(Matting123)
一.产品概述 OBS直播抠绿插件(Matting123)是使用绿幕.蓝幕进行抠像的虚拟直播软件,本软件需要配合OBS30.0.0或以上版本进行使用.Matting123采用自研抠图算法,该算法已达到影 ...
- 最详细STL(三)list
list就是链表啦,他的一个结点由两个指针域,一个数据域组成.list可以在任何位置以O(n)的复杂度插入元素,头部和尾部的插入的复杂度为O(1).然而list也有一个致命的缺点,因为链表的空间申请是 ...
- Windows 服务管理
创建服务 New-Service -Name NAME -BinaryPathName COMMAND -StartupType Automatic -Description DESCRIPTION ...
- SQL Server使用脚本实现自动备份
因服务器安装的SQL Server版本不支持自动定时备份,需自行实现,大概思路为: 创建备份数据库的脚本 创建批处理脚本执行步骤一中的脚本 创建Windows定时任务执行步骤二中的脚本 1. 创建SQ ...
- 记 某List.sort()后排序结果异常
背景:某次查看日志,发现数据不符合预期,希望获取的是降序排序,但是部分数据是乱序的 已知List.sort()方法应该不会出异常,所以应该是判断先后方法出问题了 果然,因为一开始写代码时,没有考虑到差 ...
- 1p-frac:已开源,仅用单张分形图片即可媲美ImageNet的预训练效果 | ECCV 2024
分形几何是一个数学分支,主要应用于作图方面.一般来说,分形经过无数次递归迭代后的结果.比如取一条线段,抹去中间的三分之一,会得到长度是原三分之一长的两条线段,中间隔着相同长度的间隙.然后重复这个动作, ...
- 结合mysql 架构分析SQL查询语句和更新语句的执行
结合mysql 架构分析SQL查询语句和更新语句的执行 一:基础架构 mysql分为Server层和存储引擎层 Server层 涵盖了大多数mysql的核心服务功能,以及所有内置的函数(例如日期.加密 ...