Ввод данных из консоли в программу

Всем Привет ! современные ООП знаю очень плохо, в общих чертах JAVA и PHP, нормально Ассемблер AVR. Понадобилось ввести данные с консоли в программу. Посмотрел образцы ввода и написал следующее

#include "LedControl.h" //  Подключаем библиотеку
LedControl lc=LedControl(12,11,10,1); // используемы пины ардуины для подключения, и сколько драйверов в цепочке
// pin 12 is connected to the CS (CS)(LOAD)
// pin 11 is connected to the CLK (CLK) 
// pin 10 is connected to LOAD(DIN) 

int a0 = 2, a1 = 5, a2 = 3, a3 = 4, a4 = 5, a5 = 1; // Здесь задаем начальное значение
void setup()
{
   //Инициируем MAX7219
  Serial.begin(9600); // активируем консоль
  Serial.setTimeout(100); // задержка конца передачи данных
  lc.shutdown(0,false);// включаем дисплей, энергосбережение
  lc.setIntensity(0,8);// устанавливаем яркость (0-минимум, 15-максимум) 
  lc.clearDisplay(0);// очищаем дисплей 
}
void loop()

{ 
    if (Serial.available()) {           //ждем когда появятся данные в консоли
    long val = Serial.parseInt();     // размещаем их в переменной val, здесь ещё разбор строки идет (парсинг)
    int a0=val%10;                   // выделяем каждое число в отдельную переменную (наши разряды экрана)
    int a1=(val/10)%10;       
    int a2=(val/100)%10;
    int a3=(val/1000)%10;
    int a4=(val/10000)%10;
    int a5=(val/100000)%10;         // это последнее число из 6 значного
    Serial.println(a0);            // это для контроля, что разложение произошло верно.
    Serial.println(a1);
    Serial.println(a2);
    Serial.println(a3);
    Serial.println(a4);
    Serial.println(a5);
lc.setChar(0,5,a5,false);
lc.setChar(0,4,a4,false);
lc.setChar(0,3,a3,false);
lc.setChar(0,2,a2,false);
lc.setChar(0,1,a1,false);
lc.setChar(0,0,a0,false);  
  }
 else a0 = 2, a1 = 5, a2 = 3, a3 = 4, a4 = 5, a5 = 1; // ещё одна попытка задать дефолтные значания.
}

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

У вас вывод срабатывает ТОЛЬКО если что то введено в консоль !
Вынесите вывод из под if или в блок else то же надо поместить вывод присвоенных значений. И изучите как размещать несколько операторов в блоке else !

1 лайк

Спасибо большое. Попробую

В чем идея заключается? У вас это работает каждый проход Луп, когда не было ввода. Это порядка миллиона раз в секунду. При этом, ни на что больше не влияет

Это видимо было попыткой решить вопрос … ТС думал что 7 строка не выполняется …

Кроме того, после

нужно “доедать” то, что там осталось (перевод строки и т.п.), иначе Вы это прочитаете при следующем вводе - никуда оно от Вас не денется.

Да ладно! ТС утверждает, что он программист на Ассемблере! Элита!! Ну, то-есть, такие то азы должен понимать :grin:

Не воспринимайте фразу про ассемблер буквально. Это всего лишь означает, что он не знает С

2 лайка

Вы совершенно правы, правила C мне мне не знакомы. Передо мной пока следующие вопросы. Я так понимаю LOOP - это бесконечный цикл. Предусмотрен ли правилами языка правильный выход из него и может ли в программе их быть более одного. В более привычной для меня среде, я реализовал бы нужный мне алгоритм следующим образом. Я опрашиваю нужный мне порт в ожидание данных (можно в цикле , можно на прерывание). Как только фиксируется получение правильных данных - делаем ветвление по адресу где эти данные обрабатываются и выполняется другой блок программы. В идеале проверка на наличие новых данных на входе - должна происходить например раз в 1 секунду. И если мы видим новые корректные данные - мы перезапускаем нужный нам участок с новыми данными (блок/функцию/подпрограмму). Но сейчас будет достаточно просто получить данные один раз и выйти из этого цикла с нужными данными. Просто сохранить их в переменных похоже не получиться. Кажется их надо объявить глобальными, что бы они донесли нужные данные до другой части программы (объекта). Пока ещё привыкаю к инкапсуляции.

Выход из loop(), если бы был возможен, означал бы остановку работы МК. Оно вам точно надо?

И чем вам тут loop() не угодил? Нужно опрашивать раз в секунду? Да без проблем, хоть раз в час. Как напишете, так и будет

Приехали. Напиши-ка return в loop();

выход в вызывающую функцию, в данном случае - main(). А вот выход из main() приводит к аборту.

1 лайк

И что будет? Неужели выход из loop()? А я то думал, что будет новая итерация того же лупа

Ну, справедливости ради - выше вы писали что будет остановка МК. А теперь на попятную пошли :slight_smile:

Нет, я написал “если бы был возможен”. Но такой возможности нет.

да почему нет-то? void loop() - точно такая же функция С, как любая другая. Когда выполняется последний оператор функции - программа из нее выходит. То, что loop() тут же запускается снова - сути не меняет, выход все равно происходит

Человек спросил про выход из бесконечного цикла, коим loop() и является. На что я ему и ответил, что а) возможности нет и б) выход из этого цикла означал бы остановку МК. Ниже Дед раскрыл эту мысль подробно

Может ознакомиться для начала? Или вы хотите тут вольный пересказ? Для самых занятых тут очень кратко

А вообще, больше похоже на полное непонимание базовых алгоритмов программирования и логики выполнения программы. На ассемблере они не нужны? Тут уж без Кнута не обойтись

Спасибо за ответы всем. На самом деле самый полный ответ я получил от Komandir. Прошу никого не обижаться. А второе сообщение написал - что бы поделится ходом своих мыслей и ещё раз показать отсутствие необходимых знаний и навыков. Я конечно разберусь, все упирается в свободное время, которого у меня нет. Работаю в сфере электронных компонентов и ремонта электроники. Помочь хочу другому человеку с проектом. У меня основные проблемы от не знания основ и опыта в C. По идее все должно быть проще, кубики покрупней, но с новыми свойствами. Простите если потратил чьё то время зря.