Почему так происходит?

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Сидел сейчас "дружил" SIM900r с мегой вот таким кодом (привожу только loop):

void loop() {
 String gprs="";
if (Serial.available()) Serial3.write(Serial.read());
if (Serial3.available()){
  while (Serial3.available()) {
  char ser=Serial3.read();
  gprs+=ser;
//delay(3);
  }
  Serial.print(gprs);

int index=gprs.indexOf("RING");

if (index!=-1) Serial.println("I call");


}
}

Результат - Не получаю сообщение "I call" либо получаю раз из 10ти... Стоит раскомментировать делэй, так все становится отлично, хотя в Serialе в обоих случаях одно и тоже получаю... Че за ерунда такая?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Andrey-S пишет:

Не получаю сообщение "I call" либо получаю раз из 10ти... 

а потом 

Andrey-S пишет:

хотя в Serialе в обоих случаях одно и тоже получаю...

А я не вижу, чтобы "I call" куда то еще выводился.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Чуток неправильно выразился... В первом случае получаю в Serial'е стандартные RING+номер телефона звонящего и еще чуток сетевой инфы, а "I call" не получаю, хотя как бы вроде должен, а во втором случае те же RING+номер телефона звонящего + "I call"... Почему же в первом случае "I call" не приходит, а во втором приходит?

Araris
Offline
Зарегистрирован: 09.11.2012

Я вообще-то избегаю delay(), но в данном случае он вполне уместен. SIM900 недостаточно проворен, так дайте ему успевать выталкивать символы в Serial3.

char GSM_data;
GSM_ReceivedString = "";
while ( Serial3.available() > 0 )
 {
 GSM_data = Serial3.read();
 GSM_ReceivedString += GSM_data;
 #ifdef DEBUG
  Serial.print(GSM_data);
 #endif
 delay(10); // С меньшей паузой периодически съедало концовку SMS-ки.
 }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Andrey-S пишет:
Почему так происходит?
 
«Жизнь такова, какова она есть,
и больше - никакова!»
 
Владимир Костров
Andrey-S
Offline
Зарегистрирован: 02.01.2015

Araris пишет:

Я вообще-то избегаю delay(), но в данном случае он вполне уместен. SIM900 недостаточно проворен, так дайте ему успевать выталкивать символы в Serial3.

Согласен с Вами и хорошо, что я вообще догадался воткнуть туда delay, но у меня же происходит обнуление String'a каждый раз и если бы (по моему мнению) SIM900 не успевал отдавать символы, то они бы терялись хоть... А это все прекрасно приходит, но "I call" не получаю нифига... Для меня это чудеса прям

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Я не помню, он (SIM900) конец строки отдает '\n' ?

Если да, крутитесь и собирайте строку пока не придет '\n'.

vit4646
Offline
Зарегистрирован: 22.12.2015

Попробуйте Serial.println("I call");Serial.flush(); что заставит жождаться завершения передачи данных в порт. А вообще у меня подобные чудеса были, и дело оказалось в том, что мало свободной памяти. Я использую Visual Micro, и он не предупреждал при компиляции об этом, однако компиляция кода в Arduino IDE вывела предупреждение что мало памяти. И пришлось искать методы экономить память. Например на Serial.print(F("I call"))  можно сильно экономить память используя F(). После оптимизации проблемы исчезли.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

vit4646 пишет:

Попробуйте Serial.println("I call");Serial.flush(); что заставит жождаться завершения передачи данных в порт. А вообще у меня подобные чудеса были, и дело оказалось в том, что мало свободной памяти. Я использую Visual Micro, и он не предупреждал при компиляции об этом, однако компиляция кода в Arduino IDE вывела предупреждение что мало памяти. И пришлось искать методы экономить память. Например на Serial.print(F("I call"))  можно сильно экономить память используя F(). После оптимизации проблемы исчезли.

Ды F() я использую для вывода странички через w5100...Ладно, в принципе проблема решена, хоть природа проблема осталась неизвестна... Сейчас взял рабочий код с Sim900 и перекинул его на Sim900r и смски перестали приходить))) Ох уж этот мир ардуиновских железяк)