Андрей Смирнов
Время чтения: ~14 мин.
Просмотров: 41

Вывод в монитор порта через Serial print, println, write

СОДЕРЖАНИЕ ►

Монитор порта Ардуино – это утилита, встроенная в среду программирования Arduino IDE и служит она для связи компьютера с контроллером. С помощью монитора последовательного порта производится отладка прошивки микроконтроллера, получение информации о работе программы и отправка команд к микроконтроллеру по USB. Рассмотрим, как работать с утилитой: выбор скорости обмена информацией, команды в скетче для вывода текста и переменных на Serial Monitor Arduino IDE.

Как включить Serial Monitor Arduino

Утилита состоит из окна, разбитого на три части. В верхней части находится поле ввода, где можно с компьютера отправлять данные в последовательный порт. В центре отображаются данные, полученные из последовательного порта. В нижней части окна — меню настроек. Монитор порта Arduino может работать с одним последовательным портом, чтобы не было ошибки при загрузке скетча и открытии Serial Monitor, необходимо выбрать COM порт на котором определилась плата Arduino UNO.

Для открытия утилиты необходимо нажать на иконку в верхнем правом углу Arduino IDE, использовать комбинацию клавиш Ctrl+Shift+M или выбрать в панели меню: Сервис -> Монитор порта. По умолчанию в Serial Monitor для Ардуино установлена скорость передачи данных 9600 бит в секунду, поэтому во многих скетчах используется такая скорость. Если скорость передачи данных в скетче и в настройках монитора порта будут разные, то вся информация будет отображаться в виде иероглифов.

serial-monitor-arduino.jpg
Как включить монитор порта ардуино: команды, скетч

Прием и отправка текста на монитор порта

  • Џ работы с утилитой, используют следующие команды:
  • Serial.begin(); — команда запускает последовательный порт
  • Serial.end(); — останавливает и очищает последовательный порт
  • Serial.print(); — отправляет данные в последовательный порт
  • Serial.println(); — отправляет данные с переносом строки
  • Serial.read();   — принимает данные из последовательного порта
  • Serial.parseInt(); — чтение больших чисел из монитора порта

Пример 1. Команды для вывода текста

voidsetup()  {    Serial.begin(9600);    // подключаем монитор портаSerial.print("Start"); // выводим текст на монитор 1 раз  }    voidloop()  {    Serial.print("Hello!"); // выводим текст 1 раз в секундуdelay(1000);            // задержка в 1 секунду  }

Пример 2. Команды с переносом строки

voidsetup()  {    Serial.begin(9600);    // подключаем монитор портаSerial.println("Start"); // выводим текст на монитор 1 раз  }    voidloop()  {    Serial.println("Hello!"); // выводим текст 1 раз в секундуdelay(1000);              // задержка в 1 секунду  }

Пример 3. Вывод переменных на монитор порта

voidsetup()  {    Serial.begin(9600);    // подключаем монитор портаSerial.println("Start"); // выводим текст на монитор 1 раз  }    voidloop()  {    byte z;                // освобождаем память для переменной zbyte x = random(0,10); // генерируем случайное число xbyte y = random(0,10); // генерируем случайное число y      z = x + y; // выполняем операцию сложения// выводим результаты арифметических операцийSerial.print(x);    Serial.print(" + ");    Serial.print(y);    Serial.print(" = ");    Serial.println(z);      delay(1000); // задержка в 1 секунду  }
serial-monitor.jpg
Скетч для общения компьютера и Ардуино через Serial Monitor

Для вывода сообщений на мониторе порта можно использовать табуляцию и перенос строк для оформления, чтобы сделать информацию удобной для восприятия.

Пример 4. Команды для табуляции и переноса строк

voidsetup()  {    Serial.begin(9600);    // подключаем монитор портаSerial.println("Start"); // выводим текст на монитор 1 раз  }    voidloop()  {    byte z;                // освобождаем память для переменной zbyte x = random(0,10); // генерируем случайное число xbyte y = random(0,10); // генерируем случайное число y      z = x * y; // выполняем операцию умножения// выводим результаты арифметических операцийSerial.print(x);    Serial.print("t"); // табуляцияSerial.print(y);    Serial.print("t"); // табуляцияSerial.print(z);    Serial.print("n"); // перенос строкиdelay(1000); // задержка в 1 секунду  }

Часто в скетчах требуется отключить Serial Monitor или очистить буфер обмена последовательного порта, для этого используется команда Serial.end();, чтобы запустить обмен информацией между Ардуино и компьютером снова выполняется команда Serial.begin();, которую можно прописать в процедуре loop. Если у вас выводятся кракозябры и иероглифы, то проверьте скорость передачи данных, установленную в скетче, и в настройках утилиты (правый нижний угол).

Как подключить монитор порта Ардуино правильно, чтобы не выводились квадратики и иероглифы мы разобрались — это команда Serial.begin(9600); (скорость обмена данными по умолчанию). Чтобы отправлять данные в последовательный порт с компьютера и управлять Ардуино, используется команда Serial.read(); для приема данных и Serial.parseInt(); для чтения больших чисел. Использование данных команд на примере можно посмотреть здесь: Управление Ардуино с компьютера.

Самой популярной средой разработки для Arduino является официальная программа от итальянских разработчиков — Arduino IDE. Можно конечно использовать и другие программы, например, имеющая обширный функционал, Atmel Studio и другие. Но сегодня мы остановимся на самом оптимальном варианте для начинающих, да и просто для любителей пошаманить долгими вечерами за компьютером, проектируя очередной проект.

2cd44a5ea3bc2e540c937f5b059c83ee.png

Скачать Arduino IDE можно на официальном сайте Arduino, в разделе программное обеспечение. Вы можете скачать любую версию, как самую новую, так и самую старую. Однако, советую также использовать версию 1.6.5 или 1.6.9, поскольку они является одними из самых стабильных и реже выдают ошибки при компиляции, казалось бы, правильно написанного кода.

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

На верхней панели расположены несколько разделов: файл, инструменты и так далее.

С помощью раздела “Файл” мы можем управлять нашими файлами и скетчами: создавать, открывать, сохранять и распечатать, то есть самые стандартные функции в подобного рода программах. Особое внимание стоит уделить здесь нескольким подразделам.

Функция “Открыть недавние” достаточна полезная, так как поможет вам открыть программные кода, с которыми вы ранее работали, и не придется тратить лишнее время на их поиски. В подразделе “Примеры” содержится огромное множество уже готовые программных кодов (скетчей), взятых на разные направления: механика, мигание светодиодом, циклы, работа с дисплеями и аналоговыми выходами и так далее. При установке новых библиотек в Arduino (для различных модулей и датчиков) число примеров увеличится. Также, эти коды содержат подробные пояснения, и поэтому данный раздел будет очень полезен начинающим, программировать на платформе Ардуино. Еще есть подраздел “Настройки”. В нем стоит обратить внимание на отдельное поле для вставки ссылок, которые позволят загрузить в программу возможность работы с другими платформами и модулями, например с семейством интернет модулей на чипе ESP.

Раздел “Правка” служит для редактирования текста, кода и пояснений для него.

Раздел “Скетч” позволит выполнить различные действия с вашим кодом, например, проверить его (отправить на компиляцию) или загрузить в память вашего устройства.

Раздел “Инструменты” служит для вывода данных с ваших датчиков на компьютер, а также для правильной настройки работы программы с платой.

И также имеется раздел “Помощь”, который, вроде как, должен решать возникающие проблемы при работе с Arduino IDE.

Остановимся подробнее на разделе “Инструменты”. Когда вы подключаете плату к компьютеру, то в этом разделе нужно настроить все необходимые параметры: выбрать в списке предложенных вашу плату, указан номер порта, к которому она подключается (посмотреть номер можно в диспетчере устройств в панели управления компьютера).

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

В данной статье хотелось бы затронуть возможность открытия в программе специального дополнительного окна, на котором будут выводиться значения сигналов и различные данные с датчиков и модулей, подключенных к Ардуино. Называется эта функция Serial Monitor (в русскоязычной версии – монитор порта). Ее, также, можно открыть с помощью сочетания клавиш Ctrl+Shift+M

По сути, это окно отвечает за последовательный порт соединения и служит для принятия или отправки различных данных на этот самый порт. В первом поле вы можете вводить различные значения (отправлять их в порт с помощью кнопки “отправить”) и получать, засчет этого, определенную информацию с Ардуино (если это прописано в вашем коде). Есть также поле для получения данных, а внизу справа можно менять скорость последовательного соединения (измеряется в битах и или в бод на секунду). Чаще всего используется значение в 9600. При использовании монитора порта, смотрите, чтобы скорости передачи данных, одна из которых прописана в скетче, а другая – установлена в самом мониторе порта, совпадали.

Чаще всего для работы с этим окном, используют две функции — Serial.print () и Serial.read(). Первая позволяет отправлять данные через порт последовательного соединения, а вторая – принимать их.

Приведем два кода для работы с монитором порта в Arduino IDE

Управление светодиодом с помощью монитора порта. Суть кода такова, что если мы введем цифру 1 в поле ввода и нажнем “отправить”, то светодиод загорится, если введем 0, то погаснет.

void setup()  {    Serial.begin(9600);  // устанавливаем скорость передачи данных последовательного соединения    pinMode(13, OUTPUT); // указываем номер контакта на плате, к которому подключен светодиод (13 - это встроенный светодиод на плате)  }      void loop()  {    // Получаем команды на включение-выключение светодиода на 13 порту.     String str = Serial.readString();    // Если команда «1» то включаем светодиод.    if (str == "1") digitalWrite(13, 1);    // Если команда «0» то выключаем светодиод.     if (str == "0") digitalWrite(13, 0);    // Делаем временную задержку в 1 секунду (1000 миллисекунд)    delay(1000);  }  

Следующий программный код позволит нам передавать данные из Arduino в Монитор порта, например слово «Amperkot»

void setup()   {    // устанавливаем скорость передачи данных последовательного соединения.    Serial.begin(9600);  }      void loop()  {    // Отправляем «Amperkot».    Serial.print("Amperkot");     // Отправляем «Amperkot» включая спецсимволы, означающие переход на новую строку.    Serial.println("Amperkot");     // Делаем временную задержку в 1 секунду (1000 миллисекунд).    delay(1000);  }  

Получаем такую картину:

Купить плату Arduino Uno

Читать другие статьи по Arduino

Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.

Поделиться:

Serial.print() и Serial.println() – это основные функции Arduino для передачи информации от платы ардуино к компьютеру через последовательный порт. На самых популярных платах Arduino Uno, Mega, Nano нет встроенного дисплея, поэтому взаимодействие с помощью монитора порта Arduino IDE является самым простым и доступным способом получения информации во время работы скетча. В этой статье мы научимся использовать методы класса Serial для отладки программ и взаимодействия с другими устройствами через UART и последовательный порт.

Функция print() библиотеки Serial

Функция print является одной из самых часто встречающихся в скетчах ардуино. Она принимает на вход текст или цифры и затем передает их через открытый последовательный порт в формате ASCII. Примеры:

  • Serial.print(“Hello, ArduinoMaster”) – на экране монитор порта мы увидим надпись Hello, ArduinoMaster
  • Serial.print(12) – число будет автоматически преобразовано и выведено как текст: 12
  • Serial.print(2.9) – это число тоже будет преобразовано в текст: 12.9
  • Serial.print(65) – в данном случае 65 передается как int и будет сконвертировано в строку “65”, которая и будет отправлена в последовательный порт.

Т.к. функция является членом класса Serial, мы должны использовать название класса и символ точки “.” в ее синтаксисе . Класс Serial объявляется в библиотеке Serial, но нам не нужно подключать эту библиотеку отдельно, она является внутренней библиотекой ардуино и подключается автоматически. Функция не возвращает значение, поэтому ее нельзя использовать для форматирования и последующего использования в скетче. Для этих целей больше подойдут методы класса String.

Перед использованием функции необходимо предварительно открыть работу с последовательным портом, используя функцию begin(). Подробную информацию по функции Serial.begin вы можете найти в отдельной статье на нашем сайте.

Естественно, мы можем передавать в качестве параметров для функции print() не константы, а переменные определенных типов. Например, так:

Текст, передаваемый с помощью print() обязательно завершается символом конца строки “”, что является стандартом для  C++ и Ардуино.

Функция println и отличия от print

Если вы попробовали использовать функцию print(), то уже обратили внимание, что вся информация в мониторе порта выводится в одной строке. Если же мы хотим вывести текст в новых строках, то должны использовать близкого родственника функции – println() .

Метод println () класса Serial выполняет ту же функцию, что и print() – он выводит в последовательный порт ASCII-текст.  Аргументы у методов тоже совпадают – мы передаем текст или число с возможным вторым аргументом, определяющим формат. Отличие же println заключается в принудительном добавлении в конце передающейся строки символа новой строки “r” (ASCII код 13). Суффикс ln обозначает сокращенное слово line (строка). Используя println, мы можем быть уверены, что следующая (но не текущая) строка будет выведена с новой строки.

Например, следующие команды выведут три строки текста, каждое предложение в новой строке.

При формировании строки мы также можем использовать следующие специальные символы: “”, “r”, “t” (символ табуляции). Табулирование позволяет печатать на экране что-то типа таблицы значений:

  Serial.print("Column1tt");  Serial.println("Column2");  Serial.print("Cell 11tt");  Serial.println("Cel l2");  Serial.print("Cell 21tt");  Serial.println("Cel 22");  

Форматирование и конвертация строк

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

Варианты значений констант для форматирования:

  • DEC – обычное число в десятичной системе исчисления
  • BIN – преобразует в двоичный код и выведет строку, содержащую только символы 0 и 1
  • OCT – преобразует в восьмеричную систему исчисления
  • HEX – преобразует в шестнадцатеричную систему
  • Цифра от 0 до 9 – используется, если первый аргумент – вещественное число с плавающей запятой. Форма указывает количество знаков после запятой, которые останутся при выводе. Само число при этом будет округлено.

Примеры:

    Serial.println(65, DEC);  // выведет “65”    Serial.println(65, BIN);  // выведет “1000001”    Serial.println(65, OCT);  // выведет 101, т.к. 65 в  8-ной системе исчисления равно 101    Serial.println(65, HEX);  // выведет 41, т.к. 65 в 16-ной системе исчисления равно 41    Serial.println(9.876, 2); // выведет два символа после запятой, предварительно округлив - 9.88    Serial.println(9.876, 0); // выведет число 10    

В старых версиях ардуино можно было использовать еще один параметр BYTE. Начиная с версии 1.0 эта константа не поддерживается и компилятор выдаст вам ошибку «Ключевое слово ‘BYTE’ больше не поддерживается». Для вывода ASCII символа по его коду нужно использовать метод write().

Функция write() библиотеки Serial

Если мы хотим передать в монитор порта не ASCII код числа, а само число, то у нас есть возможность это сделать с помощью функции write().

  • Serial.write(65);  –  В данном случае на экране мы увидим символ A, так как 65 – это символ A в ASCII. Используя функцию write, мы отправляем число 65 монитору порта в виде… числа 65, а не текста “65”, как в случае функции print(). При выводе на экран уже сам монитор порта будет конвертировать его в соответствие с таблице ASCII. В данном случае, таким символом является латинская буква A.
  • Serial.print(65);  – А теперь мы увидим на экране 65, т.к. в монитор придет уже строка, а не цифра. Каждая цифра исходного числа 65 будет предварительно сконвертирована в ASCII код и монитор порта увидит сроку «65», а не число. Этим и отличаются друг от друга функции print и write.

Проблемы с несколькими аргументами в Serial.print

Проблема при объединении текста и чисел и выводе в print в одной строке

Часто для отладки программы требуется вывести несколько значений, снабдив их каким-то комментарием. Например, такой текст:  «Sensor’s value is:  15». Если вы просто используете такой код:

Serial.print(“Sensor’s value is:  15”);

,то все отобразится правильно. Но если вы попытаетесь вместо подстроки «15» вставить реальное показание датчика, объединив строку и числовое значение, то увидите, что строка выводится некорректно.

Serial.print(“Sensor’s value is:  ” + analogRead (A0));

Этот код даст непредсказуемый результат, в мониторе порта вы не увидите или пустоту или случайный набор символов. Причина ошибки в механизме конвертации типов данных. При объединении строк  «на лету», как в нашем примере, ардуино не знает, как интерпретировать типы данных для аргументов при операторе суммирования. В процессе такой непредсказуемой конвертации и результат может быть непредсказуемым.

Для решения этой проблемы вы можете использовать два способа:

Первый вариант. Объявить предварительно переменную типа String, инициализировать ее константой-строкой и использовать в аргументе print. Такой вот пример будет работать:

String str = “Sensor’s value is:  “;

Serial.println(str + analogRead(A0));

Второй, более предпочтительный и удобный вариант: использование функции print несколько раз:

Serial.print(“Sensor’s value is:  “);

Serial.println(analogRead(A0));

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

Проблема объединения нескольких строк в аргументе функции print

Попробуйте загрузить скетч с таким фрагментом:

Serial.print(“Sensor’s value is:  ” + analogRead (A0) + “15 cm”);

В данном случае ошибка возникнет уже на стадии компиляции программы: оператор «+» не может использовать больше, чем  два аргумента. Вам придется разбить одно действие на несколько составляющих, создав предварительно готовые «заготовки» строк.

Пример скетча для print и println

В завершении давайте рассмотрим реальный скетч, в котором мы используем монитор порта Arduino IDE для вывода отладочной информации с платы контроллера.

  void setup() {      // Объявляем работу с последоватлеьным портом в самом начале    Serial.begin(9600);    // Теперь мы можем писать сообщения    Serial.println ("Hello, Arduino Master");  }    void loop() {      // Выводим таблицу с информацией о текущих значениях портов    Serial.print("Port #tt");    Serial.println("Value");    Serial.print("A0tt");    Serial.println(analogRead(A0));    Serial.print("A1tt");    Serial.println(analogRead(A1));    Serial.println("--------");    delay(1000);  }  

Используемые источники:

  • https://xn--18-6kcdusowgbt1a4b.xn--p1ai/%d0%bc%d0%be%d0%bd%d0%b8%d1%82%d0%be%d1%80-%d0%bf%d0%be%d1%80%d1%82%d0%b0-%d0%b0%d1%80%d0%b4%d1%83%d0%b8%d0%bd%d0%be/
  • https://amperkot.ru/blog/arduino-ide-serial-monitor/
  • https://arduinomaster.ru/program/arduino-serial-print-println-write/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации