我正在用 C30 和 MPLAB X 试验一个奇怪的问题,我有这段代码:
unsigned char mode;
switch(mode){ // Eligo el modo que se envio a traves del UART
case FRECUENCIMETER:
vFrecuencimetro();
break;
case LC_METER:
vLC_Meter();
break;
case VOLTMETER:
break;
case 'L':
vLogicAnalizer();
break;
}
if(mode == 'L'){
vLogicAnalizer();
}
当模式等于“L”字符时,开关不会按应有的方式进入“case 'L'”,但会进入 if 语句。 但是当我以这种方式更改代码时:
unsigned char mode;
switch(mode){
case 'L':
vLogicAnalizer();
break;
}
if(mode == 'L'){
vLogicAnalizer();
}
它完美地进入 switch 语句。其他情况定义如下:
#define FRECUENCIMETER 0
#define LC_METER 1
#define VOLTMETER 3
我使用的是 C30 编译器 v3.31 和 MPLAB X v1.41。希望你能帮助我。
谢谢
<小时/>编辑:
好的,根据答案和评论,我已经这样更改了我的代码:
char mode;
#define FRECUENCIMETER 0
#define LC_METER 1
#define LOGIC_ANALIZER 76 // 'L'
#define VOLTMETER 3
#define NO_MODE 4
switch(mode){ // Eligo el modo que se envio a traves del UART
case FRECUENCIMETER:
vFrecuencimetro();
break;
case LC_METER:
vLC_Meter();
break;
case VOLTMETER:
break;
case LOGIC_ANALIZER:
vLogicAnalizer();
break;
}
如果在 switch 语句之前我写:
mode = 'L';
switch 语句工作得很好,但是当我使用函数 ReadUART1() 从 UART 得到一个“L”时,该函数返回无符号整数:
unsigned int ReadUART1(void);
根据我的调试器,它返回“L”,对应于 unsigned int 中的数字 76,switch 语句不起作用,但模式仍然是“L”。即使我将模式更改为 unsigned int 以与该函数相同,它也不起作用。我想我必须使用 if() 语句。
最佳答案
已解决。我改变了:
unsigned int mode;
致:
volatile unsigned int mode;
或者与编译器优化级别 0 一起使用:
unsigned int mode;
感谢您的帮助。
关于c - 使用 C30 和 MPLAB X 的 switch 语句的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15146959/