我正在用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 iftete。 但是当我以这种方式改变我的代码时:
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获得一个'L'时,函数ReadUART1()返回并且unsigned int:
unsigned int ReadUART1(void);
根据我的调试器返回'L',对应于unsigned int中的数字76,switch语句不起作用但模式仍为'L'。即使我将模式更改为unsigned int与函数相同也不起作用。我想我将不得不使用if()语句。
答案 0 :(得分:0)
解决。我改变了:
unsigned int mode;
要:
volatile unsigned int mode;
或者使用编译器优化级别0:
unsigned int mode;
感谢您的帮助。