[英]Odd behavior with switch statement using C30 and MPLAB X
我正在用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();
}
当mode等于'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语句可以完美运行,但是当我从UART获得带有函数ReadUART1()的'L'时,该函数返回和无符号int:
unsigned int ReadUART1(void);
它根据我的调试器返回“ L”,它对应于unsigned int中的数字76,switch语句不起作用,但模式仍然为“ L”。 即使我将mode更改为unsigned int与该函数相同,它也不起作用。 我想我将不得不使用if()语句。
解决了。 我变了:
unsigned int mode;
至:
volatile unsigned int mode;
或与编译器优化级别0一起使用:
unsigned int mode;
谢谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.