Чтение данных из Serial

korishkras
Offline
Зарегистрирован: 18.01.2017

Приветствую всех.

Проблема актуальна очень многим и заключается в следующем: есть GSM модуль SIM800L, подключен к ардуинке. 

if (mySerial.available()) {  //если GSM модуль что-то послал нам, то
    while (mySerial.available()) {  //сохраняем входную строку в переменную val
      ch = mySerial.read();
      val += char(ch);
      delay(10);
    }
    if (val.indexOf("RING") > -1) {  //если звонок обнаружен, то проверяем номер

         delay(300); 
          Serial.println("--- MASTER RING DETECTED ---");
          delay(300);
             lcd.clear();
             Serial.println(val);
             delay(100);
           mySerial.println("ATH0");  //разрываем связь
            delay(500);
          val.toCharArray(number, 50);  //конвентируем Строка-массив
          int i;
          char myPins[50];  //размерность массива случайна (от фонаря), имхо номер должен быть из 12 символов
           for (i = 1; i < 51; i = i + 1) 
            {
              delay(100);
               Serial.println(myPins[i]); 
            }    
            String str(myPins);  //массив-строка (не работает преобразование, точнее шляпа)
            Serial.println(myPins);    
            
     }
    else
      Serial.println(val);  //печатаем в монитор порта пришедшую строку
    val = "";
 }

 

Как итог, бред из массива. А тут
String str(myPins);  //массив-строка (не работает преобразование, точнее шляпа)
            Serial.println(myPins);    
вообще выводит только один элемент массива.
Задача получить из порта модема (переменная val вданном случае), номер звонящего в формате +79.....
Использование поиска val.indexOf не проходит, ибо не знаю как задать маску и по символьное копирование.
+CLIP: "NUMBER " пишет номер, но как выдернуть его оттуда?
Возможные варианты: искать по маске, наткнувшись на +7 копировать известное число символов.
startsWitch находит символы с +, но как их потом считать все до конца и главное скопировать???
Прошу за бред с массивами сильно не критиковать=)))

 

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

1. что выводит 

Serial.println(val);

дайте строку из монитора порта.

2. 

val.toCharArray(number, 50);  //конвентируем Строка-массив
а потом 
char myPins[50]; 

не кажется странным ?

3. индексы масива в с начинаются с 0

for (i = 1; i < 51; i = i + 1)

должно быть
 
for (i = 0; i < 50; i++)

 

korishkras
Offline
Зарегистрирован: 18.01.2017

Что с 0 индексы, в курсе.

Монитор вот что выводит

GSM tester v1.0
AT+CLIP=1
OK
AT+CMGF=1
OK
AT+CSCS="GSM"
OK
--- MASTER RING DETECTED ---
RING
+CLIP: "+79082212145",145,"",0,"",0
Ј
»
r
»
Ну и в конце ATH0
 
OK
 
NO CARRIER

 

 

korishkras
Offline
Зарегистрирован: 18.01.2017

Что массив разрядностью 50 оч странно конечно, но максимум что добивался, это вывод столбцом номера. Но это не то,что нужно.Еще вот тут

val.toCharArray(number, 50);

Какую размерность указать??? Размерность массива???

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

как пример..

String val, number;

void setup() {
  Serial.begin(9600);
  while (!Serial);
 
  
  // имитуруем звонок
  val = "RING\n" ;
  val += "+CLIP: \"+79082212145\",145,\"\",0,\"\",0\n";
  Serial.println(val);

  if (val.indexOf("RING") >= 0)
  {
    Serial.print("RING number = ");
    int i = val.indexOf("+CLIP:");
    if (i >= 0) {
      i = val.indexOf("+", i + 1);
      if (i >= 0)
      {
        number = val.substring(i, val.indexOf(",", i) - 1);
      } else {
        number = "Not found!";
      }
      Serial.println(number);
    }
  }
}

void loop() {

}

 

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

korishkras пишет:

Проблема актуальна очень многим

Вы уверены, что проблема Ваших кривых рук и Вашего неумения программировать "актуальна очень многим"? :)))

korishkras пишет:

Как итог, бред из массива.

А Вы чего ожидали? Вы в этот массив что-нибудь записывали?

char myPins[50];  //размерность массива случайна (от фонаря), имхо номер должен быть из 12 символов
for (i = 1; i < 51; i = i + 1) 
{
     delay(100);
     Serial.println(myPins[i]); 
}    

Так ни фига ж! Вы объявили массив. Ничего туда не записали и кинулись печатать. Что было в памяти, то и напечаталось. А уж бред это или не бред... Кстати, < 51 - вот это как раз бред. У Вашего массива нет элемента с номером 50, есть только 0-49

korishkras пишет:

String str(myPins);  //массив-строка (не работает преобразование, точнее шляпа)

            Serial.println(myPins);    
вообще выводит только один элемент массива.

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

korishkras пишет:
Прошу за бред с массивами сильно не критиковать=)))

Вы выбирайте - или Вы хотите научиться, тогда слушайте критику. Или Вы не хотите слушать критику, тогда просто не постите сюда бред :)

 

korishkras
Offline
Зарегистрирован: 18.01.2017

Я не спорю, что в некоторых моментах именно программирования микроконтроллеров ничего не понимаю. К примеру, работа с последовательным портом для меня, честно говоря, впервые. Программирование на том же Verilog строится совсем иначе. Здесь фрагмент код был приведен для того,что бы показать, как можно решить эту проблему и не более. Структуры массивов, одно, дву- мерных я прекрасно понимаю. Но вот способа записи информации из последовательного порта именно в массивы не знаю. Тем более от конкретных значений данных. Поэтому и просил помощи. Что код выдавал откровенный бред, даже и не сомневаюсь. Но все же это лучше, чем вообще ничего. И вообще я просил конкретной помощи и получил ее, спасибо XDriver -у. А вот от вас какой-то конкретики, кроме слов, я не услышал.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

korishkras пишет:

Структуры массивов, одно, дву- мерных я прекрасно понимаю.

Цитата:
способа записи информации ... именно в массивы не знаю.

Это два взаимоисключающих утверждения.

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

korishkras пишет:

от вас какой-то конкретики, кроме слов, я не услышал.

И это очень плохо. Значит, Вы не умеете и не хотите слушать. То, что Вы называете "конкретной помощью" - это сделать за Вас - "дать Вам рыбу". Я же попытался объяснить Вам, что у Вас не так (и это актуально не только для этой задачи, а для программирования вообще), т.е. "дать Вам удочку". Вы не захотели разбираться и ничего "кроме слов" не услышали. Значит, в следующей программе Вам снова потребуется "конкретная помощь". Дело Ваше, Вам жить.

korishkras
Offline
Зарегистрирован: 18.01.2017

ЕвгенийП пишет:

korishkras пишет:

от вас какой-то конкретики, кроме слов, я не услышал.

И это очень плохо. Значит, Вы не умеете и не хотите слушать. То, что Вы называете "конкретной помощью" - это сделать за Вас - "дать Вам рыбу". Я же попытался объяснить Вам, что у Вас не так (и это актуально не только для этой задачи, а для программирования вообще), т.е. "дать Вам удочку". Вы не захотели разбираться и ничего "кроме слов" не услышали. Значит, в следующей программе Вам снова потребуется "конкретная помощь". Дело Ваше, Вам жить.

Конкретно "Рыба" и была нужна. Конкретно помощь и нужна.

korishkras
Offline
Зарегистрирован: 18.01.2017

andriano пишет:

korishkras пишет:

Структуры массивов, одно, дву- мерных я прекрасно понимаю.

Цитата:
способа записи информации ... именно в массивы не знаю.

Это два взаимоисключающих утверждения.

Да, за исключением записи данных из порта в массив.

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

korishkras пишет:

Конкретно "Рыба" и была нужна. 

Ну, тогда это не ко мне :)

korishkras
Offline
Зарегистрирован: 18.01.2017

ЕвгенийП пишет:

korishkras пишет:

Конкретно "Рыба" и была нужна. 

Ну, тогда это не ко мне :)

Дак зачем было тогда разводить диспут здесь?) Спасибо еще раз xDriver, все заработало;)

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

korishkras пишет:
Дак зачем было тогда разводить диспут здесь?)

Я ошибочно полагал, что Вы хотите научиться делать это самостоятельно, и хотел Вам помочь. Извините, больше не повторится.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

korishkras пишет:

Да, за исключением записи данных из порта в массив.

Массиву без разницы происхождение данных, которые в него пишут. Либо Вы "прекрасно понитмаете", как работать с массивом, либо - нет. Порт к этому не имеет ни малейшего отношения.

korishkras
Offline
Зарегистрирован: 18.01.2017

andriano пишет:

korishkras пишет:

Да, за исключением записи данных из порта в массив.

Массиву без разницы происхождение данных, которые в него пишут. Либо Вы "прекрасно понитмаете", как работать с массивом, либо - нет. Порт к этому не имеет ни малейшего отношения.

Массив, сам по себе, не имеет ничего сложного. Но он постоянно ругается на тип данных, к примеру в моем случае он не дружит со строками, ему только char подавай. Видимо вы тоже не очень хорошо владеете информацией о подобных вещах.

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

korishkras пишет:

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

Это точно! Мы тут все (а andriano в особенности) никак не можем типы данных подружить. Запускаем дрожащими руками, а компилятор ругается, меняем какую-нибудь буковку наобум и снова запускаем. И так трахаемся пока вдруг не проскочит. Как проскочит без ругани - это ценный код в облако, чтобы не пропал и в следующий раз пригодился. А Вы что думали, это всё хоть кто-то понимает? Нет, все как Вы - методом тыка компилятор "удовлетворяем" :)))))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Тс. Не палите контору. Ведь почему так много программистов надо что бы написать Винду. Это надо столько обезьяно-часов стучать случайно по клавишам, что бы вышла вполне рабочая Ось.