首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序在9个循环后从while循环中删除。C语言编程

程序在9个循环后从while循环中删除。C语言编程
EN

Stack Overflow用户
提问于 2014-01-11 22:19:59
回答 1查看 175关注 0票数 0

我把DHT11温度传感器连接到我的RPi上。我正在使用Adafruit DHT驱动程序,我想编辑Adafruit_DHT.c继续运行,直到用户手动停止程序。我是个C新手,我找不到为什么程序在commander(linux)中执行了9次后就退出了。我所尝试的就是在main函数中使用while。谢谢你的帮助。

代码语言:javascript
复制
#define BCM2708_PERI_BASE        0x20000000
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <assert.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <bcm2835.h>
#include <unistd.h>

#define MAXTIMINGS 150

//#define DEBUG

#define DHT11 11
#define DHT22 22
#define AM2302 22

int readDHT(int type, int pin);

int main(int argc, char **argv)
{
  if (!bcm2835_init())
        return 1;

  if (argc != 3) {
    printf("usage: %s [11|22|2302] GPIOpin#\n", argv[0]);
    printf("example: %s 2302 4 - Read from an AM2302 connected to GPIO #4\n", argv[0]);
    return 2;
  }
  int type = 0;
  if (strcmp(argv[1], "11") == 0) type = DHT11;
  if (strcmp(argv[1], "22") == 0) type = DHT22;
  if (strcmp(argv[1], "2302") == 0) type = AM2302;
  if (type == 0) {
    printf("Select 11, 22, 2302 as type!\n");
    return 3;
  }

  int dhtpin = atoi(argv[2]);

  if (dhtpin <= 0) {
    printf("Please select a valid GPIO pin #\n");
    return 3;
  }


  printf("Using pin #%d\n", dhtpin);
while(1==1){
  readDHT(type, dhtpin);
sleep(1);

}
  return 0;

} // main


int bits[250], data[100];
int bitidx = 0;

int readDHT(int type, int pin) {
  int counter = 0;
  int laststate = HIGH;
  int j=0;

  // Set GPIO pin to output
  bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);

  bcm2835_gpio_write(pin, HIGH);
  usleep(500000);  // 500 ms
  bcm2835_gpio_write(pin, LOW);
  usleep(20000);

  bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT);

  data[0] = data[1] = data[2] = data[3] = data[4] = 0;

  // wait for pin to drop?
  while (bcm2835_gpio_lev(pin) == 1) {
    usleep(1);
  }

  // read data!
  for (int i=0; i< MAXTIMINGS; i++) {
    counter = 0;
    while ( bcm2835_gpio_lev(pin) == laststate) {
    counter++;
    //nanosleep(1);     // overclocking might change this?
        if (counter == 1000)
      break;
    }
    laststate = bcm2835_gpio_lev(pin);
    if (counter == 1000) break;
    bits[bitidx++] = counter;

    if ((i>3) && (i%2 == 0)) {
      // shove each bit into the storage bytes
      data[j/8] <<= 1;
      if (counter > 200)
        data[j/8] |= 1;
      j++;
    }
  }


#ifdef DEBUG
  for (int i=3; i<bitidx; i+=2) {
    printf("bit %d: %d\n", i-3, bits[i]);
    printf("bit %d: %d (%d)\n", i-2, bits[i+1], bits[i+1] > 200);
  }
#endif

  printf("Data (%d): 0x%x 0x%x 0x%x 0x%x 0x%x\n", j, data[0], data[1], data[2], data[3], data[4]);

  if ((j >= 39) &&
      (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) {
     // yay!
     if (type == DHT11)
    printf("Temp = %d *Ce, Hum = %d \%\n", data[2], data[0]);
    FILE *f = fopen("file.txt", "w");
    if(f == NULL){
    printf("nepavyko atidaryt");
    }   
    const char *text = "write this to file";
    fprintf(f, "%d\n", data[2]);
    fclose(f);
    sleep(1);

     if (type == DHT22) {
    float f, h;
    h = data[0] * 256 + data[1];
    h /= 10;

    f = (data[2] & 0x7F)* 256 + data[3];
        f /= 10.0;
        if (data[2] & 0x80)  f *= -1;
    printf("Temp =  %.1f *C, Hum = %.1f \%\n", f, h);
    }
    return 1;
  }

  return 1;
}
EN

回答 1

Stack Overflow用户

发布于 2014-01-11 22:30:56

这可能不是唯一的问题,但每次调用ReadDHT时,您都会在此处不断递增bitidx

代码语言:javascript
复制
bits[bitidx++] = counter;

但是您永远不会重置或递减它(除了在全局范围内的初始化)。因此,在某种程度上,bitidx将超出bits的界限,导致未定义的行为。

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

https://stackoverflow.com/questions/21063356

复制
相关文章

相似问题

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