Для вывода переменной x на монитор порта следует прописать
Пользователь может вводить данные в поле ввода в окне Монитор порта для отправки значений и данных в Arduino. Любая последовательная программа или даже пользовательское последовательное приложение может использоваться для отправки данных в Arduino вместо использования окна Монитор порта.
Получение ввода
В следующем скетче показано, как получить один символ из окна Монитор порта и определить, является ли этот символ числом или нет.
Как работает скетч
Проверка символа
В основном цикле Arduino ( функция loop () ) оператор if используется для проверки того, доступен ли символ , т.е. был ли символ отправлен из окна Монитор порта и получен самим Arduino.
Этот оператор if выполняется быстро для того, чтобы запустить оператор if и вернуться в начало цикла, чтобы запустить его снова.
Ничто больше в теле оператора if не запускается, пока не будет получен символ.
Получение символа
Когда символ принимается Ардуино, он сохраняется в символьной переменной (типа char ), называемой rx_byte.
Копия полученного символа теперь сохраняется в переменной rx_byte, и мы можем использовать полученный символ в нашем скетче.
Проверьте, является ли полученный символ числом
Скетч проверяет, является ли полученный символ числом, проверяя, больше ли символ «0» и меньше или равен «9».
Фактически мы проверяем номера символов от «0» до «9», а не действительные целые числа от 0 до 9. Это связано с тем, что данные, полученные из окна Монитор порта, имеют формат ASCII.
Тот же оператор if может быть записан с использованием десятичных целых чисел следующим образом:
Этот код будет делать то же самое, что и версия выше, которая проверяет символы.
Если полученный символ является одним из числовых символов, числовой символ будет напечатан. Оператор else обрабатывает любой символ, не являющийся числовым.
Получение ввода
Предыдущий скетч использовался для получения и обработки одного символа за раз. Было бы более полезно, если бы мы могли получать всю строку за раз, тогда мы могли бы получить имя в качестве входных данных или число, состоящее из более чем одной цифры.
Нахождение конца строки
Следующий скетч является измененной версией предыдущего скетча. Помимо проверки того, получено ли число или не число, он также проверяет, получен ли символ новой строки.
Когда скетч запущен и символ отправляется из окна Монитор порта, необходимо изменить настройку в нижней части окна Монитор порта, чтобы к отправляемому символу добавлялся символ новой строки, как показано на изображении под скетчем.
Читать также: Работа операторов if и else в АрдуиноПеред запуском скетча убедитесь, что в окне Монитор порта Arduino установлено значение «Новая строка», как показано на этом изображении:
Еще, else используется для тестирования, если символ новой строки был получен, как показано в этой строке кода.
Чтение строки
Приведенный ниже скетч считывает строку в Arduino и использует символ новой строки, чтобы определить, когда строка заканчивается.
rx_str = "" ; // очищаем строку для повторного использованияКаждый отдельный символ строки принимается так же, как и в предыдущих скетчах, и сохраняется в переменной rx_byte.
Если символ не равен символу новой строки, он добавляется к объекту String rx_str
Строка кода rx_str + = rx_byte; такая же как:
Код просто помещает каждый символ в конец строки, чтобы построить строку из полученных символов.
Получение числа
Когда число получено из окна Монитор порта, оно представляет собой строку числовых символов и должно быть преобразовано в число, которое может быть сохранено в числовой переменной, таких как integer или int.
В следующем скетче проверяется, являются ли полученные символы числовыми, а затем число преобразуется в целое число.
rx_str = "" ; // очищаем строку для повторного использования Читать также: Взаимосвязь операторов if-else-if в АрдуиноСоздание строки
Строка состоит из полученных символов, как это было сделано в предыдущем скетче. Если какой-либо полученный символ не является номером символа, для переменной not_number устанавливается значение истина, чтобы «пометить», что был получен нечисловой символ.
Использование логического флага
Переменная Not_number имеет тип boolean, которое может иметь только значение истинным или ложным. В скетче эта переменная используется как флаг, который позже проверяется, чтобы увидеть, были ли получены какие-либо нечисловые символы.
Обработка строки
Если все полученные символы были числами, строка преобразуется в целое число с помощью rx_str. toInt (), умноженное на 2 и результат, сохраненный в переменной результата. Результат расчета затем печатается в окне Монитор порта.
Ограничения скетча
У этого скетча есть некоторые ограничения. Мы не можем получить результат, когда на Arduino отправлено отрицательное число, потому что знак минус активирует флаг not_number. Размер числа, которое можно умножить, также ограничен размером положительного целого числа на Arduino.
Вывод
В этой статье мы рассмотрели способы получения символов на примере трех различных программ. Если вам что-то было не понятно, то советуем изучить эту статью еще раз. Не забывайте писать скетчи вручную и ни в коем случае не копируйте. Слепое копирование не поможет вам в понимании и запоминании работы функций и самой программы. Удачи вам в изучении программирования на Ардуино.
Serial.print() и Serial.println() – это основные функции Arduino для передачи информации от платы ардуино к компьютеру через последовательный порт. На самых популярных платах Arduino Uno, Mega, Nano нет встроенного дисплея, поэтому взаимодействие с помощью монитора порта Arduino IDE является самым простым и доступным способом получения информации во время работы скетча. В этой статье мы научимся использовать методы класса Serial для отладки программ и взаимодействия с другими устройствами через UART и последовательный порт.
Функция print() библиотеки Serial
Функция print является одной из самых часто встречающихся в скетчах ардуино. Она принимает на вход текст или цифры и затем передает их через открытый последовательный порт в формате ASCII. Примеры:
Перед использованием функции необходимо предварительно открыть работу с последовательным портом, используя функцию begin(). Подробную информацию по функции Serial.begin вы можете найти в отдельной статье на нашем сайте.
Естественно, мы можем передавать в качестве параметров для функции print() не константы, а переменные определенных типов. Например, так:
Текст, передаваемый с помощью print() обязательно завершается символом конца строки “\0”, что является стандартом для C++ и Ардуино.
Функция println и отличия от print
Метод println () класса Serial выполняет ту же функцию, что и print() – он выводит в последовательный порт ASCII-текст. Аргументы у методов тоже совпадают – мы передаем текст или число с возможным вторым аргументом, определяющим формат. Отличие же println заключается в принудительном добавлении в конце передающейся строки символа новой строки “\r” (ASCII код 13). Суффикс ln обозначает сокращенное слово line (строка). Используя println, мы можем быть уверены, что следующая (но не текущая) строка будет выведена с новой строки.
Например, следующие команды выведут три строки текста, каждое предложение в новой строке.
При формировании строки мы также можем использовать следующие специальные символы: “\0”, “\r”, “\t” (символ табуляции). Табулирование позволяет печатать на экране что-то типа таблицы значений:
Форматирование и конвертация строк
Если мы передаем в последовательный порт число и хотим, чтобы оно интерпретировалось как число определенной системы счисления и выводилось в соответствующем формате, то можем использовать второй аргумент функции.
Варианты значений констант для форматирования:
- DEC – обычное число в десятичной системе исчисления
- BIN – преобразует в двоичный код и выведет строку, содержащую только символы 0 и 1
- OCT – преобразует в восьмеричную систему исчисления
- HEX – преобразует в шестнадцатеричную систему
- Цифра от 0 до 9 – используется, если первый аргумент – вещественное число с плавающей запятой. Форма указывает количество знаков после запятой, которые останутся при выводе. Само число при этом будет округлено.
Функция write() библиотеки Serial
Если мы хотим передать в монитор порта не ASCII код числа, а само число, то у нас есть возможность это сделать с помощью функции write().
Проблемы с несколькими аргументами в Serial.print
Проблема при объединении текста и чисел и выводе в print в одной строке
Часто для отладки программы требуется вывести несколько значений, снабдив их каким-то комментарием. Например, такой текст: «Sensor’s value is: 15». Если вы просто используете такой код:
,то все отобразится правильно. Но если вы попытаетесь вместо подстроки «15» вставить реальное показание датчика, объединив строку и числовое значение, то увидите, что строка выводится некорректно.
Этот код даст непредсказуемый результат, в мониторе порта вы не увидите или пустоту или случайный набор символов. Причина ошибки в механизме конвертации типов данных. При объединении строк «на лету», как в нашем примере, ардуино не знает, как интерпретировать типы данных для аргументов при операторе суммирования. В процессе такой непредсказуемой конвертации и результат может быть непредсказуемым.
Для решения этой проблемы вы можете использовать два способа:
Первый вариант. Объявить предварительно переменную типа String, инициализировать ее константой-строкой и использовать в аргументе print. Такой вот пример будет работать:
Второй, более предпочтительный и удобный вариант: использование функции print несколько раз:
Более подробно прочитать об особенностях работы со строками при выводе информации в монитор порта можно на официальной странице Ардуино.
Проблема объединения нескольких строк в аргументе функции print
Попробуйте загрузить скетч с таким фрагментом:
В данном случае ошибка возникнет уже на стадии компиляции программы: оператор «+» не может использовать больше, чем два аргумента. Вам придется разбить одно действие на несколько составляющих, создав предварительно готовые «заготовки» строк.
Пример скетча для print и println
В завершении давайте рассмотрим реальный скетч, в котором мы используем монитор порта Arduino IDE для вывода отладочной информации с платы контроллера.
Самой популярной средой разработки для Arduino является официальная программа от итальянских разработчиков - Arduino IDE. Можно конечно использовать и другие программы, например, имеющая обширный функционал, Atmel Studio и другие. Но сегодня мы остановимся на самом оптимальном варианте для начинающих, да и просто для любителей пошаманить долгими вечерами за компьютером, проектируя очередной проект.
После успешной установки программы, давайте ознакомимся с ее интерфейсом. Он выполнен в стиле минимализма и довольно прост в понимании, особенно для начинающих.
На верхней панели расположены несколько разделов: файл, инструменты и так далее.
С помощью раздела “Файл” мы можем управлять нашими файлами и скетчами: создавать, открывать, сохранять и распечатать, то есть самые стандартные функции в подобного рода программах. Особое внимание стоит уделить здесь нескольким подразделам.
Функция “Открыть недавние” достаточна полезная, так как поможет вам открыть программные кода, с которыми вы ранее работали, и не придется тратить лишнее время на их поиски. В подразделе “Примеры” содержится огромное множество уже готовые программных кодов (скетчей), взятых на разные направления: механика, мигание светодиодом, циклы, работа с дисплеями и аналоговыми выходами и так далее. При установке новых библиотек в Arduino (для различных модулей и датчиков) число примеров увеличится. Также, эти коды содержат подробные пояснения, и поэтому данный раздел будет очень полезен начинающим, программировать на платформе Ардуино. Еще есть подраздел “Настройки”. В нем стоит обратить внимание на отдельное поле для вставки ссылок, которые позволят загрузить в программу возможность работы с другими платформами и модулями, например с семейством интернет модулей на чипе ESP.
Раздел “Правка” служит для редактирования текста, кода и пояснений для него.
Раздел “Инструменты” служит для вывода данных с ваших датчиков на компьютер, а также для правильной настройки работы программы с платой.
И также имеется раздел “Помощь”, который, вроде как, должен решать возникающие проблемы при работе с Arduino IDE.
Остановимся подробнее на разделе “Инструменты”. Когда вы подключаете плату к компьютеру, то в этом разделе нужно настроить все необходимые параметры: выбрать в списке предложенных вашу плату, указан номер порта, к которому она подключается (посмотреть номер можно в диспетчере устройств в панели управления компьютера).
Чуть ниже панели с разделами изображены различные иконки. Они служат для более быстрой работы с программой. Первые две отвечают за компиляцию и за загрузку программного кода в плату, а другие три помогают создавать, открывать и сохранять ваши творения.
В данной статье хотелось бы затронуть возможность открытия в программе специального дополнительного окна, на котором будут выводиться значения сигналов и различные данные с датчиков и модулей, подключенных к Ардуино. Называется эта функция Serial Monitor (в русскоязычной версии – монитор порта). Ее, также, можно открыть с помощью сочетания клавиш Ctrl+Shift+M
Чаще всего для работы с этим окном, используют две функции - Serial.print () и Serial.read(). Первая позволяет отправлять данные через порт последовательного соединения, а вторая – принимать их.
Приведем два кода для работы с монитором порта в Arduino IDE
Следующий программный код позволит нам передавать данные из Arduino в Монитор порта, например слово "Amperkot"
Приветствую всех, сегодня хочу рассказать вам о небольшой подпрограмме или утилите, кому как удобней, под названием «Монитор порта». Если вы уже знакомы с Arduino IDE то вы не раз с ней сталкивались и догадались о чем пойдет речь. Но не торопитесь уходить, вам точно будет что прочесть, так как мы пройдемся от основ до полного разбора ее работы.
И так, «Монитор порта» это небольшая подпрограмма Arduino IDE, предназначенная для приёма-передачи данных из-в Arduino. Ввиду того, что Arduino IDE не имеет никаких средств отладки скетчей, это единственное средство проверить все ли работает верно, и так как надо.
Состоит подпрограмма из одной формы, при запуске, Arduino IDE передает ей номер COM-порта, с которым она должна работать, после чего она пытается с ним соединиться и в случае успеха, начинает прослушивать и выводить на экран всю полученную информацию.
Саму форму «Монитора порта» можно разбить на три части: верхняя, центральная и нижняя.
В целом, форма не сложная, элементов на ней мало, запутаться сложно. На этом с описанием мы закончим и начнем подробный разбор.
Передача данных из Arduino в «Монитор порта»
Начнем мы с Arduino.
Для того чтобы передать данные из Arduino в «Монитор порта» необходимо в функции setup() проинициализировать класс Serial вызвав его метод begin попутно передав скорость и настройки COM-порта.
- Где скорость - это скорость передачи данных бод в секунду.
- В настройках (не обязательный параметр) же указывается, сколько информационных бит в байте, а также количество стоповых бит и добавлять ли бит четности. По умолчанию если не передать настройки (а они нам не нужны в 99.9% случаев), класс Serial возьмёт стандартные настройки, а именно:
- Количество информационных бит в байте – 8.
- Количество стоповых бит – 1.
- Бит четности – Без бита четности.
Что такое стартовый бит, информационный бит, бит четности, почему скорость измеряется в бодах, я расскажу вам в другой статье, иначе переварить такой большой объём информации, а статья получиться не маленькая, будет не просто. Сейчас же мы будем пользоваться стандартными настройками, где скорость равна 9600 бод в секунду, а настройки Arduino будет выбирать автоматически.
Итого у нас получилось следующее:
Таким образом, в мониторе порта мы будем видеть строку, состоящую из двух «Hellow World!» каждую секунду (см. фото выше).
Класс Serial содержит и другие методы для работы с монитором порта, но, как правило, методов print и println достаточно в большинстве случаев.
Получение данных отправленных из «Монитора порта» в Arduino
Теперь мы попробуем получить команды, отправленные из монитора порта в Arduino и использовать их, например, для включения или выключения светодиода.
Поможет нам с этим все тот же класс Serial и его метод readString.
И так по команде «HIGH» мы будем включать светодиод, а по команде «LOW» будем выключать.
Итого у Вас должно получиться следующее.
Вот так, без особых мучений можно создать N-е количество команд и обрабатывать их в Arduino.
Ну а далее о формате передачи данных.
Формат передачи данных
Напоследок, мы поговорим о том, в каком же виде происходит обмен информацией между «Монитором порта» и Arduino. Не смотря на то, какие данные вы передаете из Arduino в монитор порта, все они конвертируются в строку формата ASCII (см. таблицу), то же самое происходит и при отправке данных из монитора порта в Arduino. Т.е. отправив число десять, вы на самом деле отправляете не число, а строку, состоящую из двух символов, символ единицы и символ нуля.
К примеру, отправив один байт равный 128, на самом деле монитор порта получит три байта.
- Байт 49 – Символ единицы в кодировке ASCII.
- Байт 50 – Символ двойки.
- Байт 56 – Символ восьмерки.
При выполнении метода println мы получим и вовсе 5 байт. Где первые три будут описанные выше, а два дополнительных это байт CR (13) и LF(10), означающие перевод на новую строку.
Посмотрев таблицу символов ASCII, многие заметят, что в ней присутствует символы только латиницы, в следствии чего отправив к примеру "Привет мир!", в мониторе порта мы получим какие то кракозябры. Пользуясь случаем хочу прорекламировать альтернативный монитор порта, написанный авторами портала, который понимает не только надписи на Русском, но и на других языках.
И вот теперь прочтя все, что я тут написал, наконец, можно рассказать что такое «Постфикс», выпадающий список в нижней части монитора порта.
Постфикс это байт или байты, в зависимости от того какой пункт вы выбрали, которые будут добавлены к данным которые вы ввели в поле для отправки.
- В постфиксе выбрано «Нет конца строки» - Монитор порта отправит только то что было введено в поле для отправки, не добавляя ничего.
- В постфиксе выбрано «NL (Новая строка)» - Монитор порта отправит то, что было введено в поле для отправки, и добавит байт LF (10).
- В постфиксе выбрано «CR (Возврат каретки)» - Монитор порта отправит то, что было введено в поле для отправки, и добавит байт CR (10).
- В постфиксе выбрано «NL & CR» - Монитор порта отправит то, что было введено в поле для отправки, и добавит два байт CR (13) и LF (10).
На этом все. Пишите в комментариях, что вам не понятно, и в новых статьях мы попробуем расписать это более подробно.
Ну а следующая статья будет о том, как написать свой монитор порта на Delphi.
Arduino IDE способна не только загружать код в плату, но и взаимодействовать с ней через COM-порт (англ. communications port). Для этого используется «Монитор последовательного порта».
Введите следующий код в рабочее поле и загрузите в плату.
Блок setup ()
Функция Serial.begin () (4 строка) — задаёт скорость последовательной передачи данных между платой и ПК. Скорость указана в бодах (бит/сек). Оба устройства (контролер и Ваш компьютер) должны работать на одной скорости.
Блок loop ()
Функция Serial.println () (7 строка) — передаёт данные через COM-порт в виде строки (строка пишется в кавычках " "), в конце которой указаны символы переноса и начала новой строки (каждое следующее значение отображается с новой строки). Функция Serial.print () делает то же самое, но не добавляет в конце строки символы переноса и начала новой строки.
После загрузки скетча откройте «Монитор порта», нажав на кнопку в правом верхнем углу или выбрав его через меню «Инструменты».
Возможности окна монитора
- Поле ввода. Используется для отправки данных в Arduino.
- Поле данных. Используется для отображения полученных из Arduino данных.
- Поле дополнительных настроек.
- Автопрокрутка — при установке флага данные будут автоматически пролистываться к последнему значению.
- Line End — возможность установить один из 4 постфиксов при отправке данных в Arduino:
"Нет конца строки" — строка без изменения;
"NL (Новая строка)" – к строке добавляется символ новой строки;
"CR (Возврат каретки)" – к строке добавляется символ возврата каретки;
"NL & CR»NL & CR"– к строке добавляются оба предыдущих символа. - Скорость передачи — скорость, с которой будут взаимодействовать ПК и плата. Должна совпадать со скоростью, которую Вы указали в скетче (функция Serial.begin ()).
- Очистить вывод — возможность полностью очистить поле данных. Новые значения будут отображаться с первой строки.
Дополнительное задание
Читайте также: