首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >尝试理解循环遍历40位的for循环

尝试理解循环遍历40位的for循环
EN

Stack Overflow用户
提问于 2019-04-08 06:13:18
回答 1查看 83关注 0票数 0

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

https://cdn-shop.adafruit.com/datasheets/Digital+humidity+and+temperature+sensor+AM2302.pdf此处提供了DHT22的数据表

这是循环通过这些位的主要代码块。

这就是我认为正在发生的事情;你有一个从-3开始的8位int,因为它使用3位来开始与传感器通信。I<2* 40将i保持在2以下,但迭代了40次(这是在黑暗中刺杀,我以前没有见过它)。

接下来是我完全不太理解的位,while循环,如果引脚是高-1并且是== (i(i是0) & 1),那么while循环将是低的,或者如果i是1,那么循环将是高的。然后进入if语句where if (i >= 0 && (i& 1)),但我最终不是总是1吗?如果不是,是什么在修改i?根据我所看到的,你不想在信号低的时候移动比特?

我可以看到剩下的代码在做什么,我只是不理解它,第一个if语句在每个循环中移动数据留下的位i,如果信号在> 30微秒是高电平,那么位是1,并向数据添加1。

代码语言:javascript
复制
// 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;
}
EN

回答 1

Stack Overflow用户

发布于 2019-04-08 11:40:29

代码语言:javascript
复制
// 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”循环中断时,数据位左移:当条件的三元运算符结果(高或低)计算为false时,就会发生这种情况。因为我们缺乏对高和低的定义,所以还不太清楚什么时候应该发生这种情况。

但是,由于:

  • 全大写标识符通常表示标识符表示宏,
  • 高和低具有严格恒定的真值将使其中的三元表达式完全没有意义(如果为真,则为真,否则为假??),
  • 在所有这些假设中区分上升沿和下降沿的值,
  • 几乎没有其他合理的地方可以发生这种情况(除非引脚读取函数在内部执行,注释讨论只是水冷式的东西)

<代码>F210>

...we可能会假设它们各自展开为某种类型的表达式,结果决定了循环是否应该停止。

因此,data <<= 1;很可能在以下情况下发生:

  • digitalRead(pin)为高,*~something~*
  • digitalRead(pin)为低,*~something else~*

在我看来,如果~某物~和~其他~物~取决于age的值,这将是最有意义的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55564143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档