Serial begin – крайне важная инструкция Arduino, она позволяет установить контроллеру соединение с внешними устройствами. Чаще всего таким «внешним устройством» оказывается компьютер, к которому мы подключаем Arduino. Поэтому Serial begin интенсивней всего используется в скетчах, выводящих какую-то информацию на экран монитора порта, например, для отладки программы. С помощью последовательного порта плата ардуино соединяется с Bluetooth, GSM, GPS и многими другими модулями, поэтому и Serial begin – частый гость в скетчах ардуинщиков. О том, как его можно использовать и пойдет речь в этой статье.
Краткое описание
Функция begin() является методом класса Serial. Для работы с этим классом не нужно подключать внешних библиотек, т.к. он встроен в среду разработки ардуино. Использовать Serial.begin() целесообразно один раз, в самом начале работы скетча, в функции void setup(). В качестве аргументов нужно указать скорость обмена данными через последовательный порт. Самым распространенным значением является 9600 – именно такая скорость обмена данными в мониторе порта Arduino IDE стоит по умолчанию. После выполнения функции ардуино будет способна как отправлять данные на внешние устройства, так и получать их.
Пример использования функции:
void setup(){ Serial.begin(9600); }
Другие популярные методы класса Serial:
- print()
- println()
- read()
- available()
- parseInt()
На платах с несколькими «железными» последовательными портами, например, Arduino Mega, для каждого из них создается свой объект Serial, поэтому вместе с Serial могут встречаться вызовы объектов Serial1, Serial2, Serial3.
Синтаксис функции
Команда Serial.begin () состоит из двух частей. Первая часть, Serial, является названием класса библиотеки для работы с монитором порта. Вторая часть, begin() обозначает название метода, которому мы должны передать один аргумент – скорость обмена данными. Функция не возвращает значений.
Синтаксис функции, два варианта:
Serial.begin(<скорость>)
Serial.begin(<скорость>, <config> )
Параметры:
- скорость – скорость взаимодействия (бит/сек или бод).
- config – настройки режима работы последовательного порта. По умолчанию используется наиболее распространенный вариант, SERIAL_8N1.
Скорость для последовательного порта в Serial.begin()
Стандартное значение скорости в аргументе функции begin() – 9600. Эта цифра означает, что плата ардуино будет посылать по последовательному порту данные со скоростью 9600 бит в секунду (нужно учитывать, что для каждых 8 бит еще высылаются служебный стоповый бит). Естественно, приемно-передающее устройства на другом конце провода тоже должно быть настроено на эту же скорость, иначе оно будет пропускать некоторые биты или излишне торопиться, что приведет к рассинхронизации – информация будет как бы рваться на кусочки. Поэтому без лишней надобности не меняйте параметр по умолчанию – 9600.
Кроме стандартного значения можно устанавливать и другие: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200. Чем выше цифра, тем выше скорость обмена, но нужно следить, чтобы эту скорость поддерживало и внешнее устройство. В некоторых ситуациях слишком высокая скорость обмена может привести к ошибкам, нужно учитывать и это. Так, например, значение 115200 устанавливаются обычно специальными высокоскоростными устройствами, например, полетными контроллерами. Значения ниже 9600 используются крайне редко.
Второй параметр для последовательного порта
Параметр config в функции begin обычно не указывается, т.к. крайне редко надо менять значения по умолчанию. Но на всякий случай приведем здесь возможные варианты параметров, которые можно найти в HardwareSerial.h:
- #define SERIAL_5N1 0x00
- #define SERIAL_6N1 0x02
- #define SERIAL_7N1 0x04
- #define SERIAL_8N1 0x06
- #define SERIAL_5N2 0x08
- #define SERIAL_6N2 0x0A
- #define SERIAL_7N2 0x0C
- #define SERIAL_8N2 0x0E
- #define SERIAL_5E1 0x20
- #define SERIAL_6E1 0x22
- #define SERIAL_7E1 0x24
- #define SERIAL_8E1 0x26
- #define SERIAL_5E2 0x28
- #define SERIAL_6E2 0x2A
- #define SERIAL_7E2 0x2C
- #define SERIAL_8E2 0x2E
- #define SERIAL_5O1 0x30
- #define SERIAL_6O1 0x32
- #define SERIAL_7O1 0x34
- #define SERIAL_8O1 0x36
- #define SERIAL_5O2 0x38
- #define SERIAL_6O2 0x3A
- #define SERIAL_7O2 0x3C
- #define SERIAL_8O2 0x3E
В этих константах обозначаются разные варианты структуры пакета данных. Например, SERIAL_8N2 означает, что по последовательному порту ардуино передаст пакет длиной 8 бит без бита контроля четности (указано N) и с одним стоповым битом, который будет добавлен после байта данных.
Исходный код класса Serial на гитхабе.
Вопросы и ответы
Serial begin 9600 – что это значит?
Эти три слова похожи на какую-то мантру. И действуют они так же: каким-то волшебным образом наша плата ардуино организовывает канал связи и начинает информационный обмен. Конечно, на самом деле никакой мистики во всем этом нет, но заклинание мы запомнить должны:
Serial.begin(9600);
Эта строчка говорит контроллеру ардуино, что нужно обратиться к последовательному порту по UART интерфейсу, открыть его для записи и подписаться на любые события с его стороны (для получения данных). Она обязательно должна использоваться перед выводом информации в монитор порта или считыванием данных.
На каких платах работает функция?
Эта функция работает на любых платах Arduino: Uno, Mega, Nano, Leonardo и т.д. Особенностью плат с несколькими «железными» последовательными портами является возможность вызывать объект Serial для каждого из этих портов.
Что будет, если не использовать функцию в скетче?
Все последующие команды для работы с последовательным портом не будут работать. Вы не сможете ни отправлять данные с помощью функций print() или println(), ни получать данные с помощью read() или readBytes().
Можно ли сократить функцию Serial.begin()?
Для многих начинающих программистов написание непривычных конструкций вызывает дискомфорт. Вы можете «сократить» Serial.begin() до синонима и использовать его, если так будет удобно. Для этого нужно воспользоваться #define. Вот пример:
#define BEGIN Serial.begin(9600) void setup(){ BEGIN; }
Но следует сразу отметить, что данный способ использовать не рекомендуется, т.к. это усложняет и запутывает программу, а пользы и экономии места очень мало.