Нужна помощь в выдергивании номера из строки в терминале
- Войдите на сайт для отправки комментариев
Пт, 29/09/2017 - 20:39
Сабж - SIM800L; Нужно сохранить номер при поступлении самого первого входящего вызова в EEPROM, не пойму толь я дурак, толи лыжи не едут. Скетч на этапе реализации парсинга номера из строки:
#include <SoftwareSerial.h>
#include <EEPROM.h>
SoftwareSerial SIM800L(2, 3);
String serialString = "";
String lastString = "";
int number = 0;
void setup ( ) {
Serial.begin(19200);
SIM800L.begin(19200);
SIM800L.println("AT");
Serial.println("Starting...");
//delay(20000); //регистрация в сети
SIM800L.println("AT+CLIP=1");
pinMode(5, INPUT); //пин свч допплер радара
if (EEPROM.read(3) != 125){
Serial.println("First run");
}
else {
EEPROM.get (5, number);
Serial.println("phone number to calls:");
Serial.println("+" + number);
}
}
void loop( ) {
while (SIM800L.available()){
char c = (SIM800L.read());
serialString += c;
}
if (serialString != lastString){
Serial.println(serialString);
lastString = serialString;
}
if (serialString.startsWith("+CLIP:")){
Serial.println("phone number finded");
int index = serialString.lastIndexOf(",", 23);
Serial.println(serialString.substring(8, index));
}
//
if (Serial.available()){ //трансляция команд терминала ардуино в терминал модема
SIM800L.write(Serial.read());
}
}
В терминале вот такая беда:
RING +CLIP: "+79045825809",145,"",0,"",0 NO CARRIER RING +CLIP: "+79045825809",145,"",0,"",0 NO CARRIER
То есть, вход в условие начала строки с "+CLIP" не выполняется. Не пойму почему. Думал - не знаю чего-то, попробовал как в одном из примеров из инета условие с "+CLIP" менять на "RING" - ну, те же грабли.
1. Замените в 38 строке finded на found - глаза режет.
2. Вы не ждёте конца строки, а просто читаете пока в сериале что-то есть и надеетесь, что стрка пришла целиком. Это не всегда так. В любом случае, в строку 38 вставьте такую конструкцию:
Serial.print("just before comparison:::"); Serial.print(serialString); Serial.println(":::");
И посмотрите. что у Вас там непосредственно перед сравнением. Если проблема не решится, публикуйте изменённый скетч и протокол из сериала.
1. Заменил)) Самое смешное, что перед глазами висит табличка с irr. verbs)), а что я иногда с деепричастиями делаю, ммм...))
2. Спасибо за подсказку, выяснилось, что в переменной не строки, а черт знает что, хотя в терминале и выглядит все опрятно. Получается, нужно отталкиваться от кодов возврата каретки?
В строку 38 добавлять что-то бесполезно, в условие скетч не вошел ни разу, хотя, судя по вот этому коду:
#include <SoftwareSerial.h> //в готовом устройстве перейти на Serial #include <EEPROM.h> SoftwareSerial SIM800L(2, 3); String serialString = ""; String lastString = ""; int number = 0; void setup ( ) { Serial.begin(19200); SIM800L.begin(19200); SIM800L.println("AT"); Serial.println("Starting..."); //delay(20000); //регистрация в сети //SIM800L.println("AT+CLIP=1"); pinMode(5, INPUT); //пин свч допплер радара if (EEPROM.read(3) != 125){ Serial.println("First run"); } else { EEPROM.get (5, number); Serial.println("phone number to calls:"); Serial.println("+" + number); } } void loop( ) { while (SIM800L.available()){ char c = (SIM800L.read()); serialString += c; } if (serialString != lastString){ //Serial.println(serialString); Serial.println("{" + serialString + "}"); lastString = serialString; serialString = ""; } if (lastString.startsWith("+CLIP:")){ Serial.print("just before comparison:::"); Serial.print(lastString); Serial.println(":::"); Serial.println("phone number found"); int index = lastString.lastIndexOf(",", 23); Serial.println(lastString.substring(8, index)); } // if (Serial.available()){ //трансляция команд терминала ардуино в терминал модема SIM800L.write(Serial.read()); } }и вот этому выхлопу:
Starting... First run {AT OK } {} { RING +CLIP: "+79045825809",145,"",0,"",0 } {} { RING } { +CLIP: "+79045825809",145,"",0,"",0 } {} { RIN} {G +CLIP: "+79045825809",145,"",0,"",0 } {} { RI} {NG +CLIP: "+79045825809",145,"",0,"",} {0 } {} { RI} {NG +CLIP: "+79045825809",145,"",0,"",} {0 } {} { R} {ING +CLIP: "+79045825809",145,"",0,"} {",0 } {} { RING } { +CLIP: "+79045825809",145,"",0,"",0 } {} { } {RING +CLIP: "+79045825809",145,"} {",0,"",0 } {} { RING } { +CLIP: "+79045825809",145,"",0,"",0 } {} { RIN} {G +CLIP: "+79045825809",145,"",0,"",0 } {} { NO CA} {RRIER } {}крайне низкий, но не нулевой шанс на это существует))
UPD Задача выполнена, хоть и через задницу:
if (lastString.indexOf("P: ") != -1){ Serial.println("YABADABADOOOOOOOO!!!"); int index = lastString.lastIndexOf(",", 23); Serial.println(lastString.substring((lastString.indexOf("P: ") + 5), (lastString.indexOf(",") - 1))); }В терминале снова полная дичь, но номер найден:
+CLIP: "+79045825809",145,"",0,"",0 } YABADABADOOOOOOOO!!! 79045825809 {} { RIN} {G +CLIP: "+79045825809",145,"",0,"",0 } YABADABADOOOOOOOO!!! 79045825809 {} { RI} {NG +CLIP: "+79045825809",145,"",0,"",} YABADABADOOOOOOOO!!! 79045825809 {0 } {} { NO C} {ARRIER } {}UPD 2, пораскинул мозгами и родил конструкцию
while (SIM800L.available()){ char c = (SIM800L.read()); if (c == '\r' || c == '\n'){ break; } serialString += c; }теперь строка в тесминале все не просто выглядит благопристойной, а таковой и является:
Starting... First run {AT} {} {OK} {} {RING} {} {+CLIP: "+79045825809",145,"",0,"",0} YABADABADOOOOOOOO!!! 79045825809 {} {NO CARRIER} {}ЕвгенийП, еще раз спасибо за подсказку!
Не за что.