Serial
Used for communication between the Arduino board and a computer or other devices. All Arduino boards have at least one serial port (also known as a UART or USART), and some have several.
UNO R3, UNO R3 SMD Mini
UNO R4 Minima, UNO R4 WiFi
Leonardo, Micro, Yún Rev2
On older boards (Uno, Nano, Mini, and Mega), pins 0 and 1 are used for communication with the computer. Connecting anything to these pins can interfere with that communication, including causing failed uploads to the board.
You can use the Arduino environment’s built-in serial monitor to communicate with an Arduino board. Click the serial monitor button in the toolbar and select the same baud rate used in the call to begin() .
Serial communication on pins TX/RX uses TTL logic levels (5V or 3.3V depending on the board). Don’t connect these pins directly to an RS232 serial port; they operate at +/- 12V and can damage your Arduino board.
To use these extra serial ports to communicate with your personal computer, you will need an additional USB-to-serial adaptor, as they are not connected to the Mega’s USB-to-serial adaptor. To use them to communicate with an external TTL serial device, connect the TX pin to your device’s RX pin, the RX to your device’s TX pin, and the ground of your Mega to your device’s ground.
Serial Monitor. Общаемся с компьютером
Для общения между платой Arduino и компьютером или другим устройством в контроллере используется интерфейс UART или USART, который в сочетании со встроенным в UNO USB-to-UART конвертером, позволит установить двунаправленую связь с компьютером через виртуальный последовательный порт. У некоторых моделей Arduino может быть несколько портов. Порт соединяется через цифровой пин 0 (RX) и 1 (TX) при подключении к компьютеру через USB, поэтому не используйте пины 0 и 1 для ввода/вывода.
Раньше на старых компьютерах были COM-порты, сейчас они создаются виртуально при помощи микросхемы FTDI, когда мы подключаем плату к компьютеру через USB.
Вам часто придётся использовать общение между устройствами для обмена информацией. Можно как посылать сигнал с компьютера, например, с клавиатуры, так и принимать сигналы с платы. Это полезно, чтобы узнать, что вообще происходит с сигналом из нужного вывода платы.
В Arduino IDE есть специальный значок с изображением лупы, который запускает Serial Monitor (монитор порта).
Для корректной работы с портом требуется выполнение двух условий: выбрать правильный COM-порт, выбрать скорость работы в скетче, которая должна совпадать со скоростью, выбранной в мониторе порта.
Для общения используется класс Serial. В методе setup() мы открываем порт для общения функцией Serial.begin() с указанием скорости в бодах (baud). Бод — это количество изменений сигнала в секунду. В нашем случае сигналы могут быть только двоичными, так что скорость в бодах соответствует скорости в битах в секунду. Можно использовать любую скорость, главное чтобы на приёмной и передающей сторонах они были одинаковыми. Доступные скорости можно посмотреть в настройках порта. Значение 9600 является стандартным и его можно не менять (9600 бод — 960 символов — один стартовый бит, восемь бит на сам символ и конечный бит). Если установить неправильную скорость, то вместо данных получим «мусор» — данные, которые нельзя обработать. Для обмена данными между другими компонентами скорость может быть и выше, например между платой и Bluetooth-модулем.
На платах Arduino Mega и Arduino Due доступны также Serial1, Serial2, Serial3.
Чтобы отправить сообщение в порт, используются методы print() (символы идут подряд) или println() (с переводом на новую строку).

Давайте выведем какое-нибудь сообщение. Это можно сделать в методе setup(), так как нам не нужно повторять одну и ту же фразу бесконечно. Метод loop() оставляем пустым.
void setup() < Serial.begin(9600); Serial.println("Hello Kitty!"); Serial.print("Мяу!"); >void loop()
Если посылаем строку, то обрамляем её кавычками. Если число, то кавычки не используем. Изменим функцию setup().
void setup() < Serial.begin(9600); Serial.print("А у кошки "); Serial.print(4); Serial.println(" ноги,"); Serial.print("А сзади у ней длинный хвост."); >void loop()
Можно заменить строки и числа на переменные. Перепишем пример.
String cat = "А у кошки "; int leg = 4; void setup() < Serial.begin(9600); Serial.print(cat); Serial.print(leg); Serial.println(" ноги,"); Serial.print("А сзади у ней длинный хвост."); >void loop()
Немного о числах. При работе с дробными числами, можно указать число знаков после запятой.
void setup() < float number = 9.434346502; Serial.begin(9600); Serial.print(number, 2); >void loop()
Работа с массивами и строками
Разберём пример отправки строк в случайном порядке. Любая строка уже является массивом символов. Поэтому вместо типа String, можно использовать массив char[]. Для примера создадим массив из четырёх имён и будем выводить их в случайном порядке через разные промежутки времени, используя функцию random().
char* catNames[] = < "Барсик", "Васька", "Мурзик", "Рыжик" >; void setup() < Serial.begin(9600); >void loop()

Приём данных
Выводить данные в порт просто. А вот принимать данные с компьютера и других источников сложнее. При отправлении данных, они складываются в буфер, ожидая, когда плата их прочитает. Объём буфера составляет 64 байта. Чтобы постоянно не читать пустой буфер, есть специальная функция проверки буфера Serial.available(). Она возвращает число байт, которые лежат в буфере. Обычно в коде создают условие проверки — если в буфере больше 0 байт, то выполняем какие-то команды.
Для демонстрации создадим странный пример — создадим переменную, присвоим ей данные через Serial.read() и попросим её прислать полученные данные через Serial.print(). Получится круговорот данных или эхо.
void setup() < Serial.begin(9600); >void loop() < if (Serial.available() >0) < int data = Serial.read(); Serial.println(data); >>
Проверяем на числах. Отправляем число 9, а получаем 57. Если вы получаете две строки с числами 57 и 10, то в нижней части окна выберите настройку No line ending вместо Newline.
Попробуем также отправить букву. Опять вместо t возвращается 116. Ерунда какая-то. Всё просто, функция read() работает с символьными значениями и мы видим код символа из стандартной таблицы символов ASCII.
Чтобы решить проблему, нужно изменить тип данных на char.
char data = Serial.read();
Вроде проблема решена. Мы можем принимать отдельные цифры и буквы. Но буквы только английские, а числа только однозначные.
Если мы планируем работать только с однозначными числами, то можно написать такой код.
int data = Serial.read() - '0';
Решение какое-то половинчатое. А как быть с большими числами или словами?
Если отправить двузначное число 23, то ответ разбивается на части — 2 и 3. Получается, что переменная получит последнее число 3 (промежуточные значения перезаписываются). Чтобы обработать всё число, нужно использовать метод parseInt().
int data = Serial.parseInt();
Теперь вы можете вводить любые числа. Но, наверное, вы заметите теперь небольшую задержку в ответах. Метод внутри себя перемалывает данные. Кстати, вы можете использовать и обычные символы. Если набор символов состоит только из букв, то вернётся 0. Если будут попадаться и цифры, то будут возвращаться цифры. Попробуйте комбинировать различные сочетания цифр и букв, чтобы понять, как будут обрабатываться данные.
Управление светодиодом с клавиатуры
Напишем пример управления встроенным светодиодом с клавиатуры. Если нажата клавиша 1, то светодиод должен загореться, при нажатии клавиши 0 выключим светодиод.
int ledPin = 13; byte incomingByte; void setup() < pinMode(ledPin, OUTPUT); Serial.begin(9600); >void loop() < if (Serial.available() >0) < incomingByte = Serial.read(); if(incomingByte == '1')< digitalWrite(ledPin, HIGH); >else if (incomingByte == '0') < digitalWrite(ledPin, LOW); >Serial.print("I received: "); Serial.println(incomingByte, DEC); > delay(10); >
Часть кода нам уже знакома — мы используем встроенный светодиод под номером 13.
Сигнал от компьютера поступает в виде байта. Создаём новую переменную incomingByte для этих целей.
Последовательный порт включается командой begin() с указанием скорости.
Если с компьютера поступает сигнал, то функция available() вернёт количество байт, доступное для чтения. Таким образом, мы просто убеждаемся, что какой-то сигнал пришёл (больше нуля).
После первой проверки мы проверяем введённый символ, который может быть представлен и как байт. Если символ равен единице, то включаем светодиод, как мы делали раньше. Если символ равен 0, то выключаем.
Как это выглядит на практике. Заливаем скетч и запускаем Serial Monitor (Ctrl+Shift+M). В окне Serial Monitor наверху есть текстовое поле. Вводим в него числа 1 или 0 и нажимаем кнопку Send. Можно также нажать клавишу Enter для быстрого ввода.
Для общего развития в скетч добавлены также две строчки кода, определяющие код нажатой клавиши. Таким образом вы можете узнать код для клавиш 0 и 1. Вы также можете нажимать и на другие клавиши, они не повлияют на светодиод, но вы увидите коды клавиш.
Чуть более сложный пример, когда строка задана в виде массива и символы выводятся по очереди.
#define ARRAY_SIZE 12 //global variable definition char hello[ARRAY_SIZE] = < 'h','e','l','l','o',' ','k','i','t','t','y','!'>; void setup() < Serial.begin(9600); >void loop() < //print characters from array to serial monitor for(int x = 0; x < ARRAY_SIZE; x++) < Serial.print(hello[x]); delay(250); >Serial.println(); delay(250); >
Функция Serial.end() закрывает последовательное соединение, порты RX и TX освобождаются и могут быть использованы для ввода/вывода.
В различных уроках вы будете принимать сигналы от платы Arduino. Это полезно, например, для отладки приложения, когда вы выводите сообщения и по ним ориентируетесь, какая часть программа работает, а какая — нет. Способность общения между Arduino и компьютером очень важна. Вы можете принимать сигналы не только в Arduino IDE, но и в других приложениях на компьютере. Например, в связке с Arduino часто используют приложение Processing, в котором рисуют графики поступаемых сигналов.
Если вы больше не нуждаетесь в получении данных, то закрывайте окно Serial Monitor.
Также существует библиотека SoftwareSerial. Она позволяет осуществить последовательную передачу данных через другие цифровые контакты Arduino.
Другие варианты
Чтение данных из последовательного порта возможно другими способами. Ищите расширения, например, Arduino Chrome Serial Monitor. На видео можно посмотреть, как создать расширение самостоятельно.
На C# также можно написать приложение, которое будет уметь считывать данные.
Processing также умеет работать с последовательным портом.
Дополнительное чтение
ASCIITable — распечатываем таблицу символов ASCII в разных форматах
Arduino IDE : Работа с Serial Monitor
Самой популярной средой разработки для Arduino является официальная программа от итальянских разработчиков — Arduino IDE. Можно конечно использовать и другие программы, например, имеющая обширный функционал, Atmel Studio и другие. Но сегодня мы остановимся на самом оптимальном варианте для начинающих, да и просто для любителей пошаманить долгими вечерами за компьютером, проектируя очередной проект.

Скачать 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 IDE — среды разработки для Arduino и подобных ей плат, а также узнали о мониторе порта, о предназначении функций Serial.print () и Serial.read(), о том как и для чего их используют. Надеемся, что материал был для вас интересен, а главное полезен, и желаем всем удачной компиляции!
Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Serial-порт: как с ним работать?

Очень часто при отладке различных программ на Arduino используется так называемый Serial-порт. Из него можно как считывать данные, так и отправлять команды на наше устройство.
Посмотрим, как работать с Serial, но не со стороны Arduino, а со стороны компьютера. Готовы? Поехали!
Вариант первый. Arduino IDE
Один из инструментов, входящих в состав Arduino IDE, носит гордое название — Монитор порта. Он может быть запущен только когда плата подключена к компьютеру. Есть возможность изменять скорость передачи данных, и символ окончания строки.


Если мы хотим работать только с текстом — рабочий вариант, но если при подключении открывается консоль(например в случае с Micropython), об удобстве можно забыть.
Вариант второй. Специализированное ПО
Поскольку интерфейс Serial-порта используется не только при разработке микроконтроллеров, но и в других областях IT были созданы специальные программы, для удобного взаимодействия или управления.
Одним из самых популярных решений для Windows — является программа PuTTY. Не смотря на то, что она заявлена как SSH клиент, её очень часто используют для подключения по COM-порту.


Для этого необходимо на основной вкладке среди способов подключения выбрать Serial , ввести имя порта, скорость и нажать на Open .
К сожалению данная программа доступна только для Windows. Пользователям MacOS — можно использовать CoolTerm(кстати, он доступен и для Windows и Linux)


или программу с простым названием Serial, правда за её использование после пробного периода придётся отдать 30$.


Вариант третий. Программирование
Но в том случае, когда у вас уже готовое устройство и вам необходимо им управлять, каждый раз отправлять команду — очень не удобно. Гораздо проще автоматизировать это, написав свою программу.
Для того, что бы написать программу для управления устройством через Serial-порт на Python, необходимо использовать библиотеку PySerial . Её можно установить через менеджер пакетов: pip install pyserial .
Для создания подключения и отправки сообщения необходим следующий код:
my_serial = serial.Serial('/dev/ttyS1', 115200) my_serial.write(b'command_1') my_serial.close()
Он откроет подключение на порту /dev/ttyS1 , со скоростью 115200 , затем отправит на устройство байтовую строчку b’command_1′ , а после этого закроет подключение.
Подробнее об использовании библиотеки можно прочитать в этой статье.
Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.