массив char, не понимаю

Rolan_Che
Offline
Зарегистрирован: 19.11.2015

приветствую мужики.

хочу сделать сигналку в гараж, использую М590, ну и пытаюсь разобраться со строками.

с программированием знаком очень поверхностно, но неспешно влезаю, интересно.

так вот, String многие используют, читал примеры сигналок здесь, удобно да, но мне не очень нравится, дело в чем, хотелось бы номер мастера забивать не тупо в программе, а пунктом в меню, выбрав который, контроллер ждет звонок и номер звонившего забивает мастером в епром, ну и вот: собирать строку String используя char посимвольно удобно, но разбирать опять на char посимвольно, дабы выдернуть именно номер как то не правильно, как мне кажется.. и да, возможно есть способ сделать это проще, я действительно начинающий, а со строками совсем профан, да..

как я вижу алгоритм работы с м590, слушаем порт, если что то есть, собираем в массив, потом массив начинаем посимвольно терзать длинным алгоритмом с кучей флагов в результате, которые и выведут алгоритм самой сигналки куда нужно, это грубо, не буду писать о управляемом питании м590, о ноге ринг с м590, о ноге старт м590, о проверках работоспособности путем запросов и тд

в общем не хотел так сильно отвлекаться, извините )) пока просто пытаюсь покрутить сам массив и так и этак ))

сам вопрос, объявляю массив, указываю размер, потом пробую забивать в сериал пару символов, и выводить - все получается, не понятно одно, почему при размере массива в 5 символов, получается загонять в него хоть 20..

чего я не понял здесь? массив размером 5 элементов, получается заполнить на большее число элементов.

#include <SoftwareSerial.h>

#define MassTotal 5

char mass[MassTotal];  // объявляем массив 

byte d=0;
byte i=0;

void setup() {

  Serial.begin(9600);
  

}

void loop() {


  if(Serial.available()){
    mass[i]=Serial.read(); i++;
    delay(2); d=i; 
  }
  
 if(d>0){ 
    for(byte i=0; i<d;i++) Serial.print(mass[i]);
    d=0; i=0;
 }

}

 

b707
Offline
Зарегистрирован: 26.05.2017

Потому что в языке Си обязанность проверять, не вышли ли данные за границы массива - лежит на программисте, то есть на вас.

Это можно сделать в строке 20 например так:

 

 if((Serial.available()) && (i < MassTotal)){

 

Rolan_Che
Offline
Зарегистрирован: 19.11.2015

ух ты,  т.е. если я объявил в n-е число элементов, а сам закидал туда больше, есть шанс что я зафигачу другие участки памяти, где могут быть сосвсем не повинные данные, понял, спасибо.

имеет смысл объявить массив с запасом, на все случаи

b707
Offline
Зарегистрирован: 26.05.2017

Rolan_Che пишет:

ух ты,  т.е. если я объявил в n-е число элементов, а сам закидал туда больше, есть шанс что я зафигачу другие участки памяти, где могут быть сосвсем не повинные данные

Именно так, причем шанс этот в МК очень велик - памяти-то мало.

По этой же причине обьявить большой массив на все случаи жизни часто возможности нет. Более продуктивный путь - обрабатывать приходящие сообщения по частям.

Rolan_Che
Offline
Зарегистрирован: 19.11.2015

b707 пишет:

Более продуктивный путь - обрабатывать приходящие сообщения по частям.

это типа читаем первые символы с м590 (в моем случае) и если соответствует определенным, следующими заполняем другой, специально созданный, массив? и уже дальше работаем с ним?

или чего это я, используем дальше тот же, предварительно очистив. )

или нет, наверное мне проще пока будет объявить массив в 300 элементов, и пробовать пока так, с жсм модуля вроде больше не бывает

b707
Offline
Зарегистрирован: 26.05.2017

Rolan_Che пишет:

наверное мне проще пока будет объявить массив в 300 элементов, и пробовать пока так, с жсм модуля вроде больше не бывает

На большинстве модемов есть GPRS - а значит интернет. Размеры ответа WEB-сервера могут быть сотни килобайт и сотни мегабайт. Так что советую сразу осваивать правильные приемы работы в ограиченной памяти.

Rolan_Che
Offline
Зарегистрирован: 19.11.2015

b707 пишет:

 Размеры ответа WEB-сервера могут быть сотни килобайт и сотни мегабайт. Так что советую сразу осваивать правильные приемы работы в ограиченной памяти.

вот да..

была мысль на ftp данные отправлять еще..

спасибо.