0

このセクションが間違っている可能性があることはわかっていますが、私の問題はマイクロコントローラーのプログラミング固有のものです (主に AVR)。

Uartを使用して2つのAVR atmega8間でバイトを送信しています。バイトの各ビットは何かを表し、送信された各バイトでは1ビットのみが1です

したがって、たとえば、受信したバイトの 5 番目のビットを確認したい場合は、次のように記述します。

short byte=UDR;
if(byte&(1<<5))
{
// do stuff for bit 5
}

その後、常に正常に動作します

しかし、次のように書くと:

short byte=UDR;
if(byte==0b00100000)

OR
short byte=UDR;
if(byte==0x20)

その後、それは機能しません。また、if-else の代わりに Switch-case を使用すると失敗します。問題を理解できません。コンパイラはそれを符号なしと解釈し、7 番目のビットを符号と解釈しますか? または、他の何か?コンパイラは AVR studio 5 の AVR-gnu です。

誰かが尋ねた場合、受信したバイトを示すLEDも受信機にあるので、受信したバイトが正しいことはわかっていますが、何らかの理由で条件を比較することはできません! UART がビットを誤解し、受信した実際のバイトを変更するノイズが発生する可能性はありますか?

ヘルプ !

みんな気をつけて

ここにあるものは PARANORMAL のようなものです

ようやく問題の領域を追い詰めました

受信したバイトのビットを表すために 8 個の LED を追加したところ、次のような結果が得られました。

LED は (1<<5) を 0b00100000 として表し、私が送信したものとしては問題ありません

しかし

0b00100000 の受信時に点灯するように割り当てられた他の LED (8 つを除く) は点灯しません!

FTWマン!

受信したバイトが正しいと確信しています..しかし、if-elseとswitch-caseの比較に何か問題があります

4

2 に答える 2

3

C にはバイナリ リテラルの構文がありません。入力0b00100000してコンパイルすることはできません。

プラットフォームに固有== 0x20の値がわからないため、このケースで機能しない理由を理解するのは少し難しいです。UDR

複数のビットが設定されている場合UDR、正確な等価性チェックはもちろん失敗しますが、単一ビットのテストは成功します。

switch()each の正確な値でのみ使用できcaseますが、もちろん、検査する前にマスクできます。

switch( byte & 0x20 )
{
  case 0:
   break;
  case 0x20:
   break;
}
于 2013-01-14T13:25:17.940 に答える
3

マスク定数のスペルだけでなく、2 番目の定式化によってコードの意味が変わるため、これは機能しません。少しテストするには、値を定数と比較するだけでなく、ビットごとの and ( &) を定数に適用する必要があります。

if (byte & 0b00100000)    /* note: 0b00100000 is a gcc extension */

また:

if (byte & 0x20)          /* or byte & 32, or byte & (1 << 5), etc. */
于 2013-01-14T13:34:43.960 に答える