Arduino

и не только...

YouTube Instagram TikTok Telegram VK

Serial

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

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

В таблице ниже представлены данные по последовательным портам основных плат Arduino:

Плата Пины сериального порта 1 Пины сериального порта 2 Пины сериального порта 3 Пины сериального порта 4
Uno 0(RX), 1(TX)
Nano 0(RX), 1(TX)
Mini 0(RX), 1(TX)
Mega 0(RX), 1(TX) 19(RX), 18(TX) 17(RX), 16(TX) 15(RX), 14(TX)
Due 0(RX), 1(TX) 19(RX), 18(TX) 17(RX), 16(TX) 15(RX), 14(TX)

TX - пин передачи данных, RX - пин получения данных.

Для соединения двух устройств, необходимо подключить пин TX первого устройство к пину RX второго, а пин RX первого - к пину TX второго соответственно.

Для связи с компьютером используется USB порт на Arduino, однако нужно помнить, что и в этом случае при использовании функций Serial нельзя задействовать пины RX и TX для каких-либо других целей.

Среду разработки Arduino IDE и PlatformIO имеют встроенный монитор порта Serial, главное - не забыть выставить одинаковую скорость на Arduino через функцию begin() и в IDE.

Функции библиотеки Serial

Функция Serial.begin()

Описание

Инициирует последовательное соединение, а также задает скорость передачи данных. Скорость измеряется в бит/с (бод). Для обмена данных с компьютером через USB используются значения из следующего списка: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 и 115200. При подключении двух устройств через пины RX и TX, могут использоваться любые другие значения.

Синтаксис

Serial.begin(speed)
Serial.begin(speed, config)

Параметры

speed - скорость передачи данных

config - необязательный параметр, устанавливает данные, четность и стоповые биты

Возвращаемое значение

нет

Пример
void setup()
{
  Serial.begin(115200);
}

void loop()
{
}

Функция Serial.end()

Описание

Закрывает последовательное соединение, позволяя использовать пины RX и TX для обычного использования.

Чтобы снова включить последовательное соединение, используйте функцию begin().

Синтаксис

Serial.end()

Параметры

нет

Возвращаемое значение

нет

Пример
void setup()
{
  Serial.begin(115200);
  Serial.print("Hello world!");
  Serial.end();
}

void loop()
{
}

Выражение if (Serial)

Описание
Синтаксис
if (Serial)
Параметры

нет

Возвращаемое значение

Возвращает true, если указанный последовательный порт доступен, иначе - false.

Пример

Ждем подключения перед тем, как начать работать:

void setup() 
{
  Serial.begin(9600);
  while (!Serial) {
    delay(100);
  }
}

void loop() 
{
}
Примечания

Актуально для плат с нативным последовательным портом в USB, таких, как Due, для всех других плат будет всегда возвращать true.

Функция Serial.print()

Описание

Передает данные в последовательный порт в виде удобочитаемого текста в ASCII. Может принимать разные типы данных, как то целые числа (каждая цифра преобразуется в соответствующий ей символ ASCII), числа с плавающей точкой (по умолчанию печатается 2 цифры после запятой). Байты кодируются одним символом, а единичные символы и строки - как есть.

Синтаксис

Serial.print(val)
Serial.print(val, format)

Параметры

val - значение для печати

format - базис для целых чисел или количество знаков после запятой - для чисел с плавающей точкой

Возвращаемое значение

Возвращает число переданных байт

Пример
void setup() 
{
  Serial.begin(9600);

  Serial.print(78); // выведет "78"
  Serial.print(1.23456); // выведет "1.23"
  Serial.print('N'); // выведет "N"
  Serial.print("Hello world."); // выведет "Hello world."

  Serial.print(78, BIN); // выведет "1001110"
  Serial.print(78, OCT); // выведет "116"
  Serial.print(78, DEC); // выведет "78"
  Serial.print(78, HEX); // выведет "4E"
  Serial.print(1.23456, 0); // выведет "1"
  Serial.print(1.23456, 2); // выведет "1.23"
  Serial.print(1.23456, 4); // выведет "1.2345"
}

void loop() 
{
}

Функция Serial.println()

Описание

Передает данные в последовательный порт в виде удобочитаемого текста в ASCII с последующим за ним символом новой строки (ASCII 10 или '\n').

Параметры точно такие же, как и у функции print().

Функция Serial.write()

Описание

Передает бинарные данные через последовательное соединение. Данные посылаются единичным байтом или серией байтов.

Для передачи же символов, строк, цифр или чисел, следует использовать функцию print().

Синтаксис

Serial.write(val)
Serial.write(str)
Serial.write(buf, len)

Параметры

val - значение для отправки в виде одного байта

str - строка для отправки в виде серии байтов

buf - массив для отправки в виде серии байтов

len - количество байтов, которые должны быть отправлены из массива

Возвращаемое значение

Возвращает количество записанных байтов

Пример
void setup() 
{
  Serial.begin(9600);

  Serial.write(77); // отправка байта со значением 77
  int numOfBytes = Serial.write("arduino");  // отправка строки "arduino" и сохранение длины строки в numOfBytes
}

void loop() 
{
}

Функция Serial.read()

Описание

Читает очередной доступный байт из буфера последовательного соединения.

Синтаксис

Serial.read()

Параметры

нет

Возвращаемое значение

Следующий доступный байт входящих последовательных данных (или -1, если его нет)

Пример
int inData = 0; // для входящих данных
void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  if (Serial.available() > 0) { // если есть доступные данные
    inData = Serial.read(); // считываем байт

    // выводим то, что получили
    Serial.print("I received: ");
    Serial.println(inData, DEC);
  }
}

Функция Serial.available()

Описание

Возвращает количество байтов (символов), доступных для чтения из последовательного порта.

Это данные, которые уже поступили и хранятся в последовательном приемном буфере.

Синтаксис

Serial.available()

Параметры

нет

Возвращаемое значение

Количество байтов, доступных для чтения

Пример
int inData = 0; // для входящих данных
void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  if (Serial.available() > 0) { // если есть доступные данные
    inData = Serial.read(); // считываем байт

    // выводим то, что получили
    Serial.print("I received: ");
    Serial.println(inData, DEC);
  }
}