0

我知道这可能是错误的部分,但我的问题是微控制器编程特定(主要是 AVR)!

我正在使用 Uart 在两个 AVR atmega8 之间发送字节,其中字节中的每一位代表某种东西,每个发送的字节中只有一位是 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)

然后它不起作用,如果我使用 Switch-case 而不是 if-else 它也会失败我无法理解这个问题,编译器是否将其解释为有符号的 no 和第 7 位作为符号?或者是其他东西?编译器是来自 AVR studio 5 的 AVR-gnu

如果有人问我在接收器上也有显示接收到的字节的 LED,所以我知道接收到的字节是正确的,但由于某种原因,我无法比较它的条件!仍然会有一些噪音导致 Uart 误解位,从而改变接收到的实际字节吗?

帮助 !

看着每一个人

这里的东西就像超自然

最后,我已经解决了问题区域

我添加了 8 个 LED 来表示接收字节的位,这就是我发现的:

LED 将 (1<<5) 表示为 0b00100000 没关系,因为它是我发送的

接收到 0b00100000 时分配为发光的其他 LED(不包括 8 个)不发光!

FTW 男人!

我很确定收到的字节是正确的..但是 if-else 和 switch-case 比较有问题

4

2 回答 2

3

C 没有二进制文字的语法,您无法键入0b00100000并编译它。

有点难以理解为什么它不适用于这种== 0x20情况,因为我们不知道UDR特定于您的平台的价值。

如果UDR设置了超过 1 位,那么精确相等性检查当然会失败,而单个位测试会成功。

您只能使用switch()each 的精确值case,但您当然可以在检查之前进行屏蔽:

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

It doesn't work because the second formulation changes the meaning of the code, not just the spelling of the mask constant. To test a bit, you must apply the bitwise and (&) to the constant, not just compare the value with the constant:

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

or:

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