Serial.read() и delay

DOC_tr
Offline
Зарегистрирован: 02.11.2015

Проблему описать затруднительно, поэтому сразу приведу пример

....
i = Serial.read();
if(i == 1){
  Serial.println(1);
  delay(10000);
}
....

Собственно в чем проблема - если я отправлю 1, то выведет 1, и уйдет в sleep на 10 секунд.

Если я в течении этих 10 секунд еще раз отправлю 1, то через оставшееся время он опять выведт 1 и уйдет на 10 секунд.

Есть ли возможноть как нибудь с этим бороться? Например на это время отключать считывание символов?

Jatixo
Offline
Зарегистрирован: 13.01.2016

DOC_tr пишет:

Если я в течении этих 10 секунд еще раз отправлю 1, то через оставшееся время он опять выведт 1 и уйдет на 10 секунд.

А должен что вывести, если ничего не должен, то когда тогда должен 1 выводить?

DOC_tr
Offline
Зарегистрирован: 02.11.2015

Он ничего не должен выводить. Просто на то время, пока работает скрипт (10 секунд) он не должен принимать данные, или игнорировать их. Тоесть он должен выводить 1, только в том случае, если в данный момент он не в задержке. 

А так получается что если данные пришли во время задержки, то он их ставит в очередь и обрабатывает после.

Jatixo
Offline
Зарегистрирован: 13.01.2016

Судя по коду, время которое он не в задержке будет микросекунда, нажать в этот момент будет нереально, и как Вы вообще узнаете, что он не в задержке?

okta
Offline
Зарегистрирован: 10.01.2015

delay там на 10 секунд.

По вопросу может это поможет читать?

Sr.FatCat
Offline
Зарегистрирован: 19.02.2016

Как-то так: 


//Если нужно, чтобы в течении сна в буфер точно ничего не попало, то
....
i = Serial.read();
if(i == 1){
  Serial.println(1);
  Serial.end();
  delay(10000);
  Serial.begin( изначальная_скорость_как_в_setup);
}
....

// Если достаточно чистить буфер после слипа, то

....
i = Serial.read();
if(i == 1){
  Serial.println(1);
  delay(10000);
  while(Serial.aviable()) Serial.read();
}
....

 

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

http://arduino.ru/tutorials/BlinkWithoutDelay

не пробовали поситать форум?

okta
Offline
Зарегистрирован: 10.01.2015

at0mix пишет:

http://arduino.ru/tutorials/BlinkWithoutDelay

не пробовали поситать форум?

я сильно извиняюсь, но это тут зачем?

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

okta пишет:

at0mix пишет:

http://arduino.ru/tutorials/BlinkWithoutDelay

не пробовали поситать форум?

я сильно извиняюсь, но это тут зачем?

Как обойтисьбез DELAY

delay(*) - это отсутствие обработки внешних сигналов.

Можно контролировать время задержки без функции delay обрабатывая другие сигналы в это время.

Я внятно объяснил?

Без наездов - это вопрос.

Sr.FatCat
Offline
Зарегистрирован: 19.02.2016

at0mix пишет:

Как обойтисьбез DELAY

delay(*) - это отсутствие обработки внешних сигналов.

Можно контролировать время задержки без функции delay обрабатывая другие сигналы в это время.

Я внятно объяснил?

Без наездов - это вопрос.

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

Ну и кроме того, использование delay иногда вполне оправдано.

Неясно другое - человек задал вопрос, зачем ему давать разные не совсем относящиеся к теме советы? Еще и в форме отсыла куда-то. На мой скромный взгляд, это делает форум крайне недружелюбном и малоинформативным.

Если вы подозреваете (и, вероятно, весьма оправдано), что постановка вопроса некорректна - может лучше уточнить постановку, чем отсылать?
 

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

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

Sr.FatCat пишет:

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

Ну и кроме того, использование delay иногда вполне оправдано.

строго говоря, обсуждается код #5, а не, не относящиеся к теме(с) случаи - я не заметил, где в этом коде оправдано превращение контроллера в кирпич на 10 секунд, который можно оживить исключительно прерыванием, что бы снова окирпичить на остаток времени.

Sr.FatCat пишет:

На мой скромный взгляд, это делает форум крайне недружелюбном и малоинформативным.

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

Logik
Offline
Зарегистрирован: 05.08.2014

DOC_tr пишет:

Проблему описать затруднительно

Ниче тут не затруднительно. Называется очистка буфера приема. Её Вам после deley надо делать, чтоб удалить все что напринималось до этого момента. 

Можна делать begin как писалось выше, но если на момент его вызова ещё не все было передано контролером, то оно потеряется. По хорошему должна быть у Serial специальный метод, но его нет. Я пользую вот это.

 

  void SerialFree(void)
  {
     for(;Serial.available();){Serial.read();}
  }
 

 

okta
Offline
Зарегистрирован: 10.01.2015

at0mix пишет:

okta пишет:

at0mix пишет:

http://arduino.ru/tutorials/BlinkWithoutDelay

не пробовали поситать форум?

я сильно извиняюсь, но это тут зачем?

Как обойтисьбез DELAY

delay(*) - это отсутствие обработки внешних сигналов.

Можно контролировать время задержки без функции delay обрабатывая другие сигналы в это время.

Я внятно объяснил?

Без наездов - это вопрос.

как выше объяснили, это не так, и даже Клапауций 322  с этим согласен

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

okta пишет:

как выше объяснили, это не так, и даже Клапауций 322  с этим согласен

что не так и с чем я, даже, согласен?

okta
Offline
Зарегистрирован: 10.01.2015

Вот делать мне нечего, кроме как в ваших дурацких спорах участвовать. Ок, первый и последний раз показываю, дальше хоть запоминайте, что пишете:

at0mix пишет:

delay(*) - это отсутствие обработки внешних сигналов.

Клапауций 322 пишет:

превращение контроллера в кирпич на 10 секунд, который можно оживить исключительно прерыванием

Вы же сами написали, что обработка внешних сигналов есть, пусть и прерыванием.

Реально достали чмырить молодеж. Вот если он продолжит задавать тупые вопросы явно не вникая в суть программы, то я первый его пошлю на... Что сразу то набрасываться. Не хочешь помочь - иди мимо, не мешай.

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

okta пишет:

Вы же сами написали, что обработка внешних сигналов есть, пусть и прерыванием.

Мы Клапауций 000-999 написали, что контроллер превращается в кирпич.

okta пишет:

Реально достали чмырить молодеж.

Мы Клапауций 000-999 реально объясняем молодёжи, что её(молодёжи) прапарадед были съеден саблезубым тигром в древние времена потому, что он имел глупость погладить красивую кошечку, её(молодёж) прадед был выкормлен прапрабабками человека разумного потому, что был похож на человека, сейчас молодёж оставлена людьми разумными в жывых влачить своё жалкое сусчествование исключительно из жалости к ущербным особям и гуманизму, присущему человеку разумному.

но, это не даёт права ущербным особям возникать и пытаться отстаивать равные с людьми права.