Странное поведение с оператором switch с использованием C30 и 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();
    }

Когда режим равен символу '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 работает отлично, но когда я получаю «L» от UART с функцией ReadUART1(), которая возвращает и unsigned int:

unsigned int ReadUART1(void);

И он возвращает «L» в соответствии с моим отладчиком, который соответствует номеру 76 в unsigned int, оператор switch не работает, но режим по-прежнему «L». Даже если я изменю режим на unsigned int, чтобы он совпадал с функцией, он не работает. Я думаю, что мне придется использовать операторы if().


person Andres    schedule 28.02.2013    source источник
comment
и вы уверены, что это не соответствует ни одному из других «дел»? (подсказка: переместите case 'L': в начало переключателя)   -  person KevinDTimm    schedule 01.03.2013
comment
Нет, это не соответствует ни одному другому случаю. Приведение к (int) работало отлично. Но если я поставлю его на #define LOGIC_ANALIZER ((int)'L'), он больше не будет работать.   -  person Andres    schedule 01.03.2013
comment
Вероятно, существует проблема «продвижения», поскольку переключатель и корпус должны принимать int. Итак, измените mode на int, а также case (int)'L': и попробуйте это   -  person KevinDTimm    schedule 01.03.2013
comment
Когда происходит продвижение типов, все значения/литералы для каждого случая преобразуются в тип, используемый вызовом switch().   -  person Cloud    schedule 01.03.2013
comment
Посмотрите мои правки, пожалуйста, я изменил все на тот же тип данных   -  person Andres    schedule 01.03.2013
comment
Хорошо, почему отрицательный голос?   -  person Andres    schedule 01.03.2013


Ответы (1)


Решено. Я изменил:

unsigned int mode;

To:

volatile unsigned int mode;

Или используйте с уровнем оптимизации компилятора 0:

unsigned int mode;

Спасибо за помощь.

person Andres    schedule 01.03.2013