繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM