Функция Arduino Serial begin

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;
}

Но следует сразу отметить, что данный способ использовать не рекомендуется, т.к. это усложняет и запутывает программу, а пользы и экономии места очень мало.

ПОДЕЛИТЬСЯ

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here