0

我正在用 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 得到一个“L”时,函数 ReadUART1() 返回和 unsigned int:

unsigned int ReadUART1(void);

它根据我的调试器返回“L”,它对应于 unsigned int 中的数字 76,switch 语句不起作用,但模式仍然是“L”。即使我将模式更改为 unsigned int 以与功能相同,它也不起作用。我想我将不得不使用 if() 语句。

4

1 回答 1

0

解决了。我变了:

unsigned int mode;

到:

volatile unsigned int mode;

或与编译器优化级别 0 一起使用:

unsigned int mode;

感谢您的帮助。

于 2013-03-01T00:39:08.960 回答