使用C30和MPLAB X的switch语句的奇怪行为

时间:2013-02-28 22:31:43

标签: c switch-statement microchip mplab

我正在用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()语句。

1 个答案:

答案 0 :(得分:0)

解决。我改变了:

unsigned int mode;

要:

volatile unsigned int mode;

或者使用编译器优化级别0:

unsigned int mode;

感谢您的帮助。