试图理解迭代40位的for循环

问题描述 投票:0回答:2

我最近订购了DHT22温度和湿度传感器以及我仍在等待的一些arduino nanos,我正在阅读一些教程和我将要做的事情,当我得到它们时阅读如何使用非常简单的DHT22阅读数据表后,他们对如何迭代40位数据感兴趣,因为我从来没有在代码中使用过字节,因此查找了它的库,这是这里https://github.com/markruys/arduino-DHT

DHT22的数据表在这里https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf

这是遍历位的主要代码块。

这就是我认为正在发生的事情;你有一个8位的i,从-3开始,因为它使用3位开始与传感器通信。 i <2 * 40使我低于2但是重复40次(这是在黑暗中刺,我以前没见过)。

接下来是我根本不太了解的位,while循环,如果引脚为高 - 1并且= =(i(i为0)&1)那么while循环将为LOW,或者如果我为1则循环将为高。然后流入if语句if if(i> = 0 &&(i&1)),但最终不会总是1?如果没有修改我?从我看到的你不想在信号为低电平时移动位?

我可以看到代码的其余部分正在做什么我只是不理解它,第一个if语句移动数据通过每个循环离开的数据,如果信号高达> 30微秒,则该位为1和a将1添加到数据中。

// We're going to read 83 edges:
// - First a FALLING, RISING, and FALLING edge for the start bit
// - Then 40 bits: RISING and then a FALLING edge per bit
// To keep our code simple, we accept any HIGH or LOW reading if it's max 85 usecs long

uint16_t rawHumidity = 0;  
uint16_t rawTemperature = 0;  
uint16_t data = 0;

for ( int8_t i = -3 ; i < 2 * 40; i++ ) {
  byte age;
  startTime = micros();
  do {
    age = (unsigned long)(micros() - startTime);
    if ( age > 90 ) {
      error = ERROR_TIMEOUT;
      return;
    }
  } while ( digitalRead(pin) == (i & 1) ? HIGH : LOW );

  if ( i >= 0 && (i & 1) ) {
    // Now we are being fed our 40 bits
    data <<= 1;

    // A zero max 30 usecs, a one at least 68 usecs.
    if ( age > 30 ) {
      data |= 1; // we got a one
    }
  }

  switch ( i ) {
    case 31:
      rawHumidity = data;
      break;
    case 63:
      rawTemperature = data;
      data = 0;
      break;
  }
}

// Verify checksum

if ( (byte)(((byte)rawHumidity) + (rawHumidity >> 8) + ((byte)rawTemperature) + (rawTemperature >> 8)) != data ) {
  error = ERROR_CHECKSUM;
  return;
}
c++ arduino bit
2个回答
2
投票

这就是我认为正在发生的事情;你有一个8位的i,从-3开始,因为它使用3位开始与传感器通信。我<2 * 40让我低于2但是重复40次(这是在黑暗中刺,我以前没见过)

https://en.cppreference.com/w/cpp/language/operator_precedence

*(作为乘法运算符)具有比<更高的优先级(小于),因此这些术语被分组以便首先解析*

所以(i <2 * 40)得到解决(i <(2 * 40))。它相当于(i <80)。

接下来是我根本不太了解的位,while循环,如果引脚为高 - 1并且= =(i(i为0)&1)那么while循环将为LOW,或者如果我为1则循环将为高。

do { 
...
}
while ( digitalRead(pin) == (i & 1) ? HIGH : LOW );

在这里,==具有更高的优先级,所以(digitalRead(pin) == (i & 1)首先得到解决。即,当digitalRead(pin)为0且i为偶数时,为真,digitalRead(pin)为1,i为奇数。 [since(i&1)有效地测试最低位]然后解析三元子表达式,如果为真则返回HIGH,如果为假则返回LOW。

必须运行,希望能让你到达那里。


0
投票
// We're going to read 83 edges:
// - First a FALLING, RISING, and FALLING edge for the start bit
// - Then 40 bits: RISING and then a FALLING edge per bit

当'while'循环中断时,数据位向左移动:当条件的三元运算符结果(HIGH或LOW)计算为false时,会发生这种情况。由于我们缺少HIGH和LOW的定义,因此有些不清楚到底应该发生什么。

但是,因为:

  • all-caps标识符通常表示标识符代表宏,
  • 具有严格恒定真值的HIGH和LOW将使得三元表达完全无意义(如果为真则为真,否则为假??),
  • 所有这些都可以区分上升边缘值和下降边缘,
  • 几乎没有其他合理的地方可以发生这种情况(除非引脚读取功能在内部完成,评论讨论只是水冷却器)

...我们应该假设它们每个都扩展为某种表达式,并且THAT的结果决定了循环是否应该停止。

因此,最有可能的是,data <<= 1;发生在:

  • digitalRead(pin)是高和*~something~*
  • digitalRead(pin)低和*~something else~*

从我所看到的,如果〜某些东西〜和其他东西〜取决于age的值,它将是最有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.