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();
    }

モードが「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 ステートメントは完全に機能しますが、関数 ReadUART1() を使用して UART から「L」を取得すると、unsigned int が返されます。

unsigned int ReadUART1(void);

私のデバッガによると、unsigned int の 76 番に対応する 'L' が返されます。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 に答える