Не работает цикл while()
- Войдите на сайт для отправки комментариев
Извиняюсь, что немного не в тему, но настолько странный вопрос, что обгуглился - и всё бестолку.
Дано: 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. Как так получается?
удивительное дело.
Ничего не приходит в голову, кроме каких-то нечитаемых символов в тексте. Попробуйте скопировать текст в какой-то внешний текстовой редактор, а потом вставить отттуда в новый скетч
Пробовал. Перебивал весь текст руками...
не понимаю...
А какого типа переменные currState и lastState ?
А какого типа переменные currState и lastState ?
смотрите внимаьельнее, в коде они есть
А какого типа переменные currState и lastState ?
Ну, судя по коду выше, оба uint8_t.
Не скажу за скобки, но весёлые приключения у меня на RaspberryPi с DHT были. Детали уже забылись, но помню, что на стороне DHT напряжение было маловатое - что-то на нижнем лимите по питанию. Ну и он мне всякое слал... И чем чаще опрашиваешь - тем чудесней результат.
Залил в свою ардуино нано (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; } } ; }Все прекрасно работает. На порт выводит при нажатии (низкий уровень). Возможно нужно как то указать, что не нажатым у вас высокий уровень на порту. Или типа того. Больше ничем помочь не могу...