Пример управления Arduino через Serial (COM-port) для отладки и т.п

Довольно часто нужно отлаживать код программы и самый простой - давать команды Ардуинке через Serial.
Может кому пригодится:

char sss[10];
// 10 - длина управляющей посылки 9 байт (+1 на символ конца строки)
byte sss_i=0; // индекс для приёма данных
void loop()
{
   int Code;
   if (Serial.available())
   {
               char x = Serial.read();
               if (x == ‘\n’)
               { // получили символ заверешения ввода в Serial
                        int Code = atoi(sss); // В ДАННОМ СЛУЧАЕ преобразуем строку в число
                        sss_i=0; // устанавливаем на начало строки
                        if (Code>0) /// тут же можно сразу обработать, или потом
                        { …
                                Serial.println(“Code >0!”);
                        }
                        else
                         { …
                                 Serial.println(“Code <=0!”);
                         }
              }
             else
             { // пока идет приём, и не встретился конец
                              sss[sss_i++] = x; sss[sss_i] = 0;
                              if (sss_i >= sizeof(sss)-1) sss_i = 0; // защита, если слишком много символов
             } // end of (if x!=‘\n’)
       } // end of (Serial.avalable())
      Serial.println(“Code =”); Serial.println(Code);
}// end of loop

Этот код не использует задержек, не использует тяжелый String …
Может кому пригодиться.

Если есть более элегантный способ - делитесь!

:joy:

1 лайк

Никогда не было и вот опять. Красавчик :rofl:

2 лайка

я там про защиту написал, ладно это еще куда не шло, а вот ввел я 100000, а получаю -31072, че за нах? :rofl:

Стебаешься :)))
100000 - это не int - это long :))))
Ты же сам понимаешь, что это лишь пример. для НОВИЧКОВ.
А ты уже собаку съел, и может даже зубы сточил на этом. :))))

а чейта long сразу? а я говорю что это - uint32_t, ИНТ ЖЕ, ПОПРОБУЙТЕ МЕНЯ ПЕРЕУБЕДИТЬ)

я должен стать новичком чтобы получить ответ, который удовлетворит новичка?

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

Задачка для новичков - что именно напечатает принт в 29 строке:

Ну ты то, взрослый уже, а ведешься как маленький. Не стыдно?
или сам не знаешь ответ на свой вопрос?

будет печатать
Code =
0
Code =
0
Code =
0

до тех пор, пока не будет введены данные в Serial…
и это, нет смысла стебаться. Более простого и элегантного решения для отладочного ввода я так и не увидел. Есть конкретные предложения?

нет такого типа исконного uint32_t - это макроподстановка (define) от типового == long

И хватит стебаться. :))) Есть много серьезных дел.

А потом напечатают введенный код? Уверен?

Тебя носом в ляп ткнуть или сам найдешь?

да не напечатает канешна, она исчезнет))

Есть. Сначала научиться писать программы, а потом писать “образцы для подражания” для новичков.

И после тоже. Не проще ли сказать проще – всегда будет 0.

Вы напишите это в комитет по стандарту языка, а то там мужики-то и не знают :frowning:
image

вот я всегда пользую эти uint32_t и т.п.
вот пример, ща выше написал, с пьяну, шо 100000 не лезут в ардуиновский лонг, патамушто башка дырявая и не помнит сколько байт занимает этот логн долбаный в ардуино

а тут все сразу понятно
u - беззнаковый
int - целое
32 - 32 бита или 4 байта
в башке все автоматом складывается, ага 4+ лярда поместится)

Для отладки нужно часто две вещи:

  1. сообщения, когда что-то произошло
  2. команды чтобы что-то сработало

п.1 делается через Serial.print(“\n\r СРАБОТАЛО что-то! ”);

п.2 через, например,
if (Serial.available())
switch(Serial.read())
case ‘1’: (запускаем что-то) … break;
… и там действия на какие-то символы. Это пишется быстро и просто. Потом жмем в терминале нужные символы и код получает команды. Я так делаю.

Курица или яйцо ?

Для ТС - сколько байт занимает long на ББ ?

Как это связано с кодом ТС?

Я смотрю вы тут стаей работаете - один найдет за что уцепится, а далее набегают другие, которым и сказать-то нечего

да, мы такие))
скучно тыкать за локальные переменные, вот мы и ищем чего позабористее.

А зачем в примере для новичков одновременное присутствие сток 6 и 12?
И, если мы умеем обрабатывать только int, зачем буфер на 9 символов?

Отсутсвие контроля введенных данных не более чем недочет, в то время как переменная - грубая ошибка.