задержка без delay при входе в функцию, (возможно ли)?
- Войдите на сайт для отправки комментариев
Доброго времени!
Собственно есть код управления модемом по uart, в нем при входящей смс команде к примеру переводиться переменная float в string и отправляется в функцию отправки сообшения.
if(strstr(command, sms_temp1)){
char tmptemp[10];
char* chartemp;
float dstmp = dstemp[0];
chartemp = dtostrf(dstmp, 5, 2, tmptemp);
sendTextMessage(chartemp);
void sendTextMessage(const char* sms)
{
delay(500);
GPRS.print(send_Sms);
GPRS.print(send_NumTel);
gprsCmdAndWaitln(send_Quote);
GPRS.print(sms);
gprsCmdAndWaitln(send_Enter);
}
Собственно вопрос!
Возможно ли сделать задержку в функции по millis (без delay) и дополнительных флагов или пересматривать логику? т.е.:
void sendTextMessage(const char* sms)
{
uint32_t count = millis();
if (millis() - count > 1000){
GPRS.print(send_Sms);
GPRS.print(send_NumTel);
gprsCmdAndWaitln(send_Quote);
GPRS.print(sms);
gprsCmdAndWaitln(send_Enter);
}
}
Собственно нужно это всё чтобы сделать универсальной функцию и избавиться от delay.
Заблаговременное спасибо!
ps sorry за неформатированное сообщение, только установил firefox на ubuntu, а в нем видимо нужно доустанавливать какие то плагины и собственно форматирование текста недоступно!!!
Доброго времени!
Собственно есть код управления модемом по uart, в нем при входящей смс команде к примеру переводиться переменная float в string и отправляется в функцию отправки сообшения.
Собственно вопрос!
Возможно ли сделать задержку в функции по millis (без delay) и дополнительных флагов, или пересматривать логику? т.е.:
Собственно нужно это всё чтобы сделать универсальной функцию и избавиться от delay.
Заблаговременное спасибо!
ps получилось отформатировать
Доброго времени!
Собственно есть код управления модемом по uart, в нем при входящей смс команде к примеру переводиться переменная float в string и отправляется в функцию отправки сообшения.
это типо техзадание и я в нём никак не наблюдаю необходимость задержек.
*так то оно - "да"... можно реализовать срабатывание чего-то после чего-то через определённое время, засекая время первого, вычитая текущее время и ждать пока разница не превысит требуемое для срабатывания тела условия.
!не благодари - это я от души. о_О
Чем функционально будет отличаться "задержка по millis" от delay()?
Доброго времени!
Собственно есть код управления модемом по uart, в нем при входящей смс команде к примеру переводиться переменная float в string и отправляется в функцию отправки сообшения.
Это то понятно что можно повесить в loop sendTextMessage и при её вызове возводить флаг и millis, но получается громоздко и не универсально, а хотелось чтобы при вызове определённой функции её код выполнялся с задержкой и при этом не подвисал контроллер!
тем что если в loop ещё к примеру крутиться функция опроса кнопок, тогда на время delay(я) она работать не будет, пусть конечно это в реале не столь важно, т.к. это ооочень кратковркменно и не постоянно, только на время отсыла смс, но всё же считаю это костылём!
Доброго времени!
Собственно есть код управления модемом по uart, в нем при входящей смс команде к примеру переводиться переменная float в string и отправляется в функцию отправки сообшения.
Просто иногда (редко), модем при отсылке пишет CMEERROR, видимо после приёма смс не успевает проглатить команду на отсылку, а с небольшой задержкой всё ОК!
Собственно работает всё идеально и без сбоев, просто мануал для новичков гласит что хорошая программа та, которая написана без delay!
тем что если в loop ещё к примеру крутиться функция опроса кнопок, тогда на время delay(я) она работать не будет
Если использовать millis(), как вы сделали, то... Представьте, что millis() вернуло число 450. Выполнится ли условие хоть раз, даже если МК будет переходить на след. инструкцию 10мс вместо микросекунды?
тем что если в loop ещё к примеру крутиться функция опроса кнопок, тогда на время delay(я) она работать не будет, пусть конечно это в реале не столь важно, т.к. это ооочень кратковркменно и не постоянно, только на время отсыла смс, но всё же считаю это костылём!
замените delay(500); на свою собственную функцию my_delay(500). внутри которой не просто "спите" полсекунды - а скажем проверяйте состояние кнопок
тем что если в loop ещё к примеру крутиться функция опроса кнопок, тогда на время delay(я) она работать не будет
Если использовать millis(), как вы сделали, то... Представьте, что millis() вернуло число 450. Выполнится ли условие хоть раз, даже если МК будет переходить на след. инструкцию 10мс вместо микросекунды?
Я знаю что так будет, просто привёл как пример что возможно ли что то наподобие сделать, но логически подумав понял что тему можно закрывать, ибо функцию нужно вешать в loop и по событию возводить флаг и сбрасывать таймер чтобы она работала как я хочу, так что лучше оставлю изначально с delay, так сказать компромисс между функциональностью и простотой кода
Логически правильно будет ждать ответы от модема и в случае отсутствия их в течении Х времени - принимать решение о повторе операции или продолжении работы. А у вас это просто костыли.
У Вас delay() не там стоит. Он, как я понял, нужен для того, чтобы успеть передать и обработать, и в это же время еще раз не вызвать передачу. Тогда он должен стоять после 17 строки. Его длительность надо проверять экспериментально.
В 12 строке я его присутствия не понимаю.
Вотъ
эта чо?
if
(1==0) {stage = 0;
return
;}
эта чо?
if
(1==0) {stage = 0;
return
;}
по крайней мере в логе ИДЕ должно было матюкнуться, что 1 никогда не станет равен 0, поэтому запись бессмысленна.
Ну господа, ну ясен пень! Это иллюстрация возможности ветвления. Заведомо ложное выражение. Но если на этом месте будет, например, проверка CRC полученных на предыдущих этапах данных, то можно не применять эти данные в последнем шаге с случае ошибки, а начать процедуру повторного их получения с шага #1
Чо?
Чо?
Сейчас не понял вопроса
Это просто демонстрация идеи алгоритма. Вместо (1==0) подставьте нужное условие проверки качества выполнения предыдущих шагов
А можно эту строчку вообще к хренам собачьим удалить и выполнять функцию линейно
Вот ведь докопались, изверги
Если так написать, компилятор просто выкинет эту строку и даже if делать не будет.
Вы сейчас все прикалываетесь?
А если бы я написал
Вы бы тоже рассказывали, что компилятор так не может? Серьезно?
Я четко осознаю, что компилятор не будет 1 с 0 сравнивать. Это просто заглушка для возможности организации ветвления
А если бы я написал
А если бы я написал
Думаю дефайнами можно намутить))
Ок, будь по вашему, пусть будет if (false) ....
Благородный Дон, я думаю, если бы Вы написали
то эта строчка вызвала бы намного меньше вопросов.
Благородный Дон, я думаю, если бы Вы написали
то эта строчка вызвала бы намного меньше вопросов.
Согласен с Вами уважаемый сэр! Но, как же тогда срач?
Кстати, вполне ходовым вариантом может стать проверка something.available() в этом месте. Например модем, UART или пакет NTP
Просто иногда (редко), модем при отсылке пишет CMEERROR, видимо после приёма смс не успевает проглатить команду на отсылку, а с небольшой задержкой всё ОК!
Узнаю SoftSerial ))) Задержками можно подобрать более устойчивую работу, но в корне не решите проблему. Подход предложенный в #1 очень даже верный, только по мелочам ошибки count должен быть static, ну и значение ему присваивать не каждый раз, а когда проверка выполнилась.
Ну а если двигаться дальше в направлении этом то полезно делать так: все остальные места, где есть завязка по времени реализовать аналогично; значение millis передавать в функцию параметром; возвращать из функции не void а что то, информирующее о том было ли реально выполнено в функции действие или впустую прогнали т.к. время не пришло, например true если делали что. Тогда снаружи имеем красоту
Очень симпатичная архитектура без делеев получается.