Простой интерфейс командной строки
Компоненты и расходные материалы
![]() |
| × | 1 |
Об этом проекте
Командная строка
Наступает время, когда вам нужно найти значение датчика или вы хотите сказать своему роботу сделать что-то вроде «двигаться влево». Может быть, вам нужно запросить у вашей программы значение времени выполнения переменной или вам нужно установить значение цифрового потенциометра.
Вам нужна командная строка. Да, ваш Arduino легко реагирует на текстовые команды.

Вот тот, на котором вы можете опираться. Это простой, быстрый и очень энергоэффективный интерфейс командной строки . (CLI), который вы можете вырезать и вставить за несколько минут в свой собственный код и быть готовым к работе. Команды состоят из имени, за которым следуют несколько аргументов. Он даже поддерживает backspace, когда вы вводите свои команды.
Краткий обзор
В каждом эскизе есть loop ()
функция. Ваш может быть таким же простым, как приведенный ниже. Он вызывает две подпрограммы на отдельной вкладке с именем CommandLine.h
. Я проведу вас по этим двум файлам, и вы будете готовы к работе.

Петля
Что он делает: Каждый раз loop ()
запускает его, проверяет, есть ли у нас команда из последовательного порта, вызывая getCommandLineFromSerialPort ()
. Переменная CommandLine
объявлен в CommandLine.h
но стилистически вы можете переместить его на основную вкладку цикла. Когда полная команда поступила на последовательный порт и была скопирована в буфер команд:
char commandLine [COMMAND_BUFFER_LENGTH + 1];
Затем loop ()
вызывает DoMyCommand ()
для выполнения правильной команды.
Теперь давайте посмотрим, что находится в CommandLine.h
. Я должен указать, что я поместил весь код в CommandLine.h
, потому что тогда все, что вам нужно сделать, это вырезать и вставить этот код в новую вкладку в вашей среде разработки Arduino (обязательно дайте вкладке имя, которое заканчивается на " .h
"). Затем включите этот файл в свой основной файл, т. Е.
#include "CommandLine.h"
Это позволяет вам поместить весь код командной строки на одну вкладку и при этом ссылаться на его подпрограммы в другом месте вашей программы без какого-либо дополнительного кода.
Просмотр в CommandLine.h
Файл CommandLine.h
включен в конце этого поста. В CommandLine.h
, каждая строка, которую необходимо изменить, помечена комментарием, // Изменить здесь
. Файл включает две примерные команды add
. и sub
и показывает, как они вызываются из DoMyCommand
.
Многим из вас это все, что вам нужно. Просто пройдите CommandLine.h
. Для тех, кто хочет более детального ознакомления, продолжайте читать.
Взгляд глубже
В CommandLine.h
сначала мы включаем
. String.h
это стандартная библиотека C . Если вы раньше не сталкивались с библиотеками C, поищите в Интернете "The C Programming Language". Библия C была написана много лет назад Брайаном Керниганом и Деннисом Ричи и постоянно обновляется. У большинства людей есть копия, но вы можете найти ее в Интернете бесплатно.
Мы будем использовать только strtok ()
процедура (строка в токен) из
. Эта процедура считывает токен, то есть слово, разделенное определенными символами (второй параметр strtok
). Это работает так.
- Когда вы впервые вызываете его, вы передаете ему строку
ptr
и он вернет первый токен
- При последующих вызовах (вот и замечательная часть взлома) передайте ему NULL вместо строки
ptr
и он продолжит с того места, где остановился, с начальной строки, таким образом получая один токен (примерно слово) за раз.
Мы также включаем
из которого мы используем только atoi ()
для преобразования ascii в целое число. Не волнуйтесь, компилятор будет включать только эту подпрограмму, а не всю библиотеку, но вы можете проверить другие подпрограммы в этих библиотеках, поскольку они полезны.
Затем я написал необязательный небольшой макрос под названием print2:
#define print2 (x, y) (Serial.print (x), Serial.println (y)
Я всегда хочу распечатать этикетку и строку. Вы используете это так:
print2 ("myVar =", myVar);
Если myVar равен 25, это будет печататься в окне последовательного порта:
myVar =25
CommandLine.h
содержит getCommandLineFromSerialPort ()
который собирает командную строку из последовательного порта. Каждый раз, когда он вызывается, он читает из последовательного порта и сохраняет ввод в глобальный буфер ввода, CommandLine []
. Когда он достигает return
символ, обозначающий конец команды, он возвращает true
.
Полностью собранный буфер теперь передается в DoMyCommand ()
. который определяет, какую функцию запрашивает пользователь, и вызывает ее. Используя большое количество команд, вы можете получить довольно громоздкий оператор if-the-else.
Если у вас действительно огромное количество команд, есть много способов ускорить процесс, например, использование так называемой хеш-функции. В качестве альтернативы вы можете сделать команды только одним символом, а затем использовать этот один символ как метку оператора switch-case. Я часто считаю, что ни то, ни другое не требуется. Слово намного легче запомнить, чем отдельный символ, и, учитывая, что это Arduino, сколько команд у вас действительно может быть, прежде чем у вас закончится место на чипе?
Добавить и добавить
Каждая командная функция отвечает за анализ собственных аргументов. Это простой способ сделать это, и его достаточно легко изменить. Альтернативой этому является немедленное чтение всех аргументов в DoMyCommand
. Вы можете поместить отдельные аргументы в глобальный массив строк argv []
.
Для этого примера я определил две команды: add
и sub
. Оба они используют числовые аргументы, но я включил readWord
(который можно было бы назвать readStringToken
), чтобы вернуть слово. Вы также можете изменить этот readStringToken
чтобы разрешить такие строки, как « это строка
". Считайте это упражнением, оставленным читателю.
Самый быстрый способ бегать
Если у вас есть основной файл цикла, как показано выше, создайте новую вкладку, используя направленный вниз треугольник справа от окна Arduino IDE, и скопируйте CommandLine.h
(ниже) файл в него, вы должны иметь возможность ввести добавить
и sub
команды.
Теперь дело за вами!
Код
- Простой интерпретатор командной строки для Arduino
Простой интерпретатор командной строки для Arduino C / C ++
См. Комментарии в этой статье или в коде, чтобы добавить простую командную строку в свой скетч Arduino.Вы можете добавлять такие команды:
прибавить 5, 10
вычесть 10, 5
Или что-нибудь еще, что вам нужно
/ **************************************** *********************************** Как использовать CommandLine:Создайте эскиз. Посмотрите ниже образец настройки и код основного цикла, скопируйте и вставьте его в новый эскиз. Создайте новую вкладку. (Используйте раскрывающееся меню (маленький треугольник) в дальнем правом углу редактора Arduino. Назовите вкладку CommandLine.h Вставьте в нее этот файл. Тест:загрузите только что созданный эскиз в Arduino, как обычно, и откройте окно последовательного порта. Наберите эти команды, а затем return:сложите 5, 10 вычтите 10, 5 Посмотрите на включенные команды сложения и вычитания и затем напишите свои собственные! ********************* ************************************************* ****** Вот что творится под одеялом ************************************* *************************************** Простой и понятный интерпретатор командной строки. Этот файл позволит вы должны вводить команды в последовательное окно, например, добавить 23 599 blink 5 playSong Yesterday к вашему скетчу, запущенному на Arduino, и выполнить их. Примечание по реализации:здесь будут использоваться строки C, а не объекты String, исходя из предположения, что если вам понадобится commandLine интерпретатора, вам, вероятно, тоже не хватает места, а объект String имеет тенденцию к неэффективному использованию места. 1) Команды простого протокола - это слова и числа, разделенные пробелами или запятыми. Первое слово - это команда, каждое дополнительное слово - это аргумент. "\ N" завершает каждую команду 2) Использование подпрограммы библиотеки C strtok:команда - это слово, разделенное символом пробелы или запятые. Слово, разделенное определенными символами (например, пробелом или запятой), называется токеном. Чтобы получить токены один за другим, я использую strtok маршрутизации C lib (часть C stdlib.h, см. Ниже, как его включить). Это часть библиотеки языка C, которую вы можете найти в Интернете. В основном вы:1) передаете ему строку (и используемые вами разделители, то есть пробел и запятую), и он вернет первый токен из строки 2) при последующих вызовах, передайте ему NULL (вместо строки ptr), и он будет продолжить с того места, где он остановился, с начальной строки. Я написал несколько базовых вспомогательных подпрограмм:readNumber:использует strtok и atoi (atoi:ascii to int, снова часть C stdlib.h) для возврата целого числа. Обратите внимание, что atoi возвращает int, и если вы используете 1-байтовые целые числа, такие как uint8_t, вам нужно будет получить lowByte (). readWord:возвращает ptr к текстовому слову 4) DoMyCommand:список if-then-elses для каждой команды. Вы могли бы сделать это оператором case, если бы все команды были одним символом. Использование слова более читабельно. Для целей этого примера у нас есть:Add Subtract nullCommand * // ****************** пример кода основного цикла ************* *********************** #include "CommandLine.h" void setup () {Serial.begin (115200); } void loop () {получено bool =getCommandLineFromSerialPort (CommandLine); // глобальная CommandLine определена в CommandLine.h if (получено) DoMyCommand (CommandLine); } *********************************************** ******************************** /// Назовите эту вкладку:CommandLine.h # include #include // следующий макрос хорош для отладки, например print2 ("myVar =", myVar); # определить print2 (x, y) (Serial.print (x), Serial.println (y)) # определить CR '\ r' # определить LF '\ n' # определить BS '\ b' # define NULLCHAR '\ 0' #define SPACE '' #define COMMAND_BUFFER_LENGTH 25 // длина последовательного буфера для входящих команд char CommandLine [COMMAND_BUFFER_LENGTH + 1]; // Считываем команды в этот буфер из Serial. +1 в длину для завершения charconst char * delimiters =", \ n"; // команды могут быть разделены символом возврата, пробела или запятой / ************************************ ************************************************* ********************** Здесь имена ваших команд * / const char * addCommandToken ="add"; // Изменить здесьconst char * subtractCommandToken ="sub"; // Измените здесь / ******************************************* ************************************************* ************** getCommandLineFromSerialPort () Возвращает строку следующей команды. Команды разделяются символом return "Обработать символ BackSpace Сделать все символы строчными буквами ************************************ ************************************************* ********************** / boolgetCommandLineFromSerialPort (char * commandLine) {static uint8_t charsRead =0; // примечание:COMAND_BUFFER_LENGTH должен быть меньше 255 символов // читать асинхронно до полного ввода команды while (Serial.available ()) {char c =Serial.read (); switch (c) {case CR:// вероятно, сейчас в буфере есть полная команда, команды завершаются CR и / или LS case LF:commandLine [charsRead] =NULLCHAR; // нулевое завершение массива char if (charsRead> 0) {charsRead =0; // charsRead статическое значение, поэтому необходимо сбросить Serial.println (commandLine); return true; } break; case BS:// обрабатываем пробел во вводе:помещаем пробел в последний символ if (charsRead> 0) {// и настраиваем commandLine и charsRead commandLine [- charsRead] =NULLCHAR; Serial < Сумма =", результат); } else {if (strcmp (ptrToCommandName, subtractCommandToken) ==0) {// Изменить здесь result =subtractCommand (); // K&R string.h стр. 251 print2 ("> Разница =", результат); } еще {nullCommand (ptrToCommandName); }}}
Производственный процесс
- С# Комментарии
- С# интерфейс
- Java-интерфейс
- Интерфейс для беспроводного датчика проезжей части
- Простой аналоговый датчик приближения с цифровым интерфейсом (для Raspberry Pi) [последнее обновление:7 февраля 2014 …
- ЭНДИ:многоцелевой робот-гуманоид
- Простой робот Pi
- C — аргументы командной строки
- С# — Интерфейсы
- Что такое линия продольной резки рулонной стали?