Не работает цикл while()

b_calavasov
Offline
Зарегистрирован: 11.01.2019

Извиняюсь, что немного не в тему, но настолько странный вопрос, что обгуглился - и всё бестолку.

Дано: RaspberryPI 3B с чистым, кошерным Raspbian. Пытаюсь использовать Си-шный пример для датчика DHT-22 через вшитую в Raspbian библиотеку wiringPI.

Данные с датчика в примере не считываются. Сперва грешу на неработающий DHT-22, нахожу замену - картина не меняется. Осцилографом встаю на пин - вижу и запрос от процессора, и ответ от датчика. Всё по-честному, но программа не отлавливает ответ дачика. В конце концов упираюсь в следующий кусок кода:

 

#define DHTPIN 2

void main () {
    uint8_t lastState = 1;
    uint8_t currState = 1;
    pinMode( DHTPIN, INPUT );
    counter = 0;
    timeStamp = micros();
    while (currState == lastState)
    {
		currState = digitalRead( DHTPIN );
		// printf("%d", currState);
		counter++;
		delayMicroseconds( 1 );
		if ( counter == 255 )
			{
				timeCurrent = micros();
				printf( "Counter wachdog. Breaking.\n" );
				printf("Time inetrval: %d\n", (timeCurrent - timeStamp));
				break;
			}
	} ;
}

Перед этим куском кода Малинка успешно отправляет по данному пину запрос на передачу информации, а датчик (как это видно на осцилографе), успешно информацию назад отправляет. Но при этом из цикла программа вываливается ТОЛЬКО по переполнению счетчика 'counter', хотя, если расскомментировать строку printf, то видно, как в течении этого периода в 255 значений бегут и меняются нули и единички по digitalRead.

И самое странное и удивительное, о чем собственно и вопрос: если же условие While поставить в двойные скобки, всё начинает работать!

while ( ( currState == lastState ) ) {
    ...code
    }

Вот когда условие - в двойных скобках, цикл While корректно отлавливает изменение currState. Как так получается?

b707
Offline
Зарегистрирован: 26.05.2017

удивительное дело.

Ничего не приходит в голову, кроме каких-то нечитаемых символов в тексте. Попробуйте скопировать текст в какой-то внешний текстовой редактор, а потом вставить отттуда в новый скетч

b_calavasov
Offline
Зарегистрирован: 11.01.2019

Пробовал. Перебивал весь текст руками...

не понимаю...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А какого типа переменные currState и lastState ?

b707
Offline
Зарегистрирован: 26.05.2017

BOOM пишет:

А какого типа переменные currState и lastState ?

смотрите внимаьельнее, в коде они есть

kostyamat
Offline
Зарегистрирован: 16.11.2017

BOOM пишет:

А какого типа переменные currState и lastState ?


Ну, судя по коду выше, оба uint8_t.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не скажу за скобки, но весёлые приключения у меня на RaspberryPi с DHT были. Детали уже забылись, но помню, что на стороне DHT напряжение было маловатое - что-то на нижнем лимите по питанию. Ну и он мне всякое слал... И чем чаще опрашиваешь - тем чудесней результат.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Залил в свою ардуино нано (168 мега) вот такой скетч:

void setup() {
  // put your setup code here, to run once:

 Serial.begin(9600);
 delay(500);
}

void loop() {
      uint8_t lastState = 1;
      uint8_t currState = 1;
      pinMode( 2, INPUT );
      byte counter = 0;
      uint32_t timeStamp = micros();
      uint32_t timeCurrent;
      while (currState == lastState)
      {
          currState = digitalRead( 2 );
          // printf("%d", currState);
          counter++;
          delayMicroseconds( 1 );
          if ( counter == 255 )
              {
                  timeCurrent = micros();
                  Serial.println( "Counter wachdog. Breaking." );
                  //Serial.println("Time inetrval: %d\n", (timeCurrent - timeStamp));
                  break;
              }
      } ;
}

Все прекрасно работает. На порт выводит при нажатии (низкий уровень). Возможно нужно как то указать, что не нажатым у вас высокий уровень на порту. Или типа того. Больше ничем помочь не могу...