Нужна помощь в выдергивании номера из строки в терминале

CatSoup
Offline
Зарегистрирован: 01.05.2017

Сабж - 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" - ну, те же грабли.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Замените в 38 строке finded на found - глаза режет.

2. Вы не ждёте конца строки, а просто читаете пока в сериале что-то есть и надеетесь, что стрка пришла целиком. Это не всегда так. В любом случае, в строку 38 вставьте такую конструкцию:

Serial.print("just before comparison:::"); Serial.print(serialString); Serial.println(":::");

И посмотрите. что у Вас там непосредственно перед сравнением. Если проблема не решится, публикуйте изменённый скетч и протокол из сериала.

CatSoup
Offline
Зарегистрирован: 01.05.2017

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
}
{}

крайне низкий, но не нулевой шанс на это существует))

CatSoup
Offline
Зарегистрирован: 01.05.2017

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
}
{}

 

CatSoup
Offline
Зарегистрирован: 01.05.2017

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}
{}

ЕвгенийП, еще раз спасибо за подсказку!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не за что.