Arduino Serial: Обзор различных библиотек Serial

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

Hardware Serial (Аппаратный Serial)

Наиболее надёжная реализация Serial использует выделенные пины RX и TX (пины 0 и 1 на большинстве плат). Все платы Arduino имеют как минимум один аппаратный серийный канал. Некоторые платы имеют больше — например, Arduino Mega предоставляет четыре аппаратных серийных канала.

Arduino Uno — расположение пинов RX/TX Arduino Nano — расположение пинов RX/TX Arduino Mega — несколько серийных портов Arduino Mini Pro — без USB-разъёма

Ключевые преимущества:

  • Лучшая производительность, наиболее надёжная и стабильная работа

  • Возможность одновременной передачи и приёма

  • Работает во время выполнения других задач Arduino

  • Поддерживает высокие скорости передачи

  • Встроена в IDE; установка библиотеки не требуется

Важное замечание: Arduino IDE использует аппаратный Serial для загрузки кода, поэтому подключённые устройства, возможно, потребуется отключить при программировании.

Код инициализации:

void setup()
{
    Serial.begin(115200);
    while (!Serial) {  ;  }
    Serial.println("Hello World");
}

void loop()
{
}

Платы на базе ATmega328 (Uno, Nano) имеют только один аппаратный серийный канал. Некоторые платы (Mini Pro) не имеют USB-разъёма и требуют внешних адаптеров.

SoftwareSerial

Стандартная библиотека Arduino IDE, позволяющая использовать последовательную связь на большинстве пинов через программную реализацию.

Инициализация:

#include <SoftwareSerial.h>
SoftwareSerial swSerial(2, 3); // RX, TX

Ограничения:

  • Не может одновременно передавать и принимать данные

  • Только один экземпляр может быть активным в один момент времени

  • Не очень хорошо работает на очень медленных или быстрых скоростях

  • Скорость передачи следует держать в диапазоне 9600 – 38400

  • Отключает прерывания во время работы, блокируя выполнение скетча

  • Конфликтует с библиотеками, зависящими от прерываний

SoftwareSerial использует прерывания смены пинов при приёме данных, а как приём, так и передача используют циклы задержки. Во время задержки прерывания отключены.

Пример:

#include <SoftwareSerial.h>
SoftwareSerial swSerial(2, 3);

void setup()
{
    swSerial.begin(9600);
    swSerial.println("Hello, world!");
}

void loop()
{
}

AltSoftSerial

Разработана Полом Стоффрегеном (создателем Teensy). Эта библиотека обеспечивает превосходную производительность программного Serial, используя 16-битный таймер.

Преимущества:

  • Может одновременно передавать и принимать данные

  • Минимальное влияние при одновременном использовании Hardware Serial

  • Более надёжна на высоких скоростях по сравнению с другими программными Serial

  • Лучшая обработка прерываний

Ограничения:

  • Фиксированные пины для каждой платы (см. таблицу ниже)

  • Отключает ШИМ на определённых пинах

  • Использует Timer1; несовместима с библиотеками, требующими тот же таймер

Таблица назначения пинов:

Плата

TX

RX

Недоступный ШИМ

Nano, Uno, Duemilanove, Micro Pro

9

8

10

Mega

46

48

44, 45

Leonardo, Yun, Micro

5

13

нет

Teensy 3.0/3.1/3.2/3.5/3.6

21

20

22

Пример кода:

#include <AltSoftSerial.h>
AltSoftSerial altSerial;

void setup()
{
    altSerial.begin(9600);
    altSerial.println("Hello World");
}

void loop()
{
}

NeoSWSerial

Написана Slash Devin. Эта библиотека улучшает стандартный SoftwareSerial, сохраняя гибкий выбор пинов.

Особенности:

  • Работает с большинством пинов

  • Может одновременно принимать и передавать данные

  • Более дружелюбна к прерываниям на RX, чем SoftwareSerial

  • Ограниченные скорости передачи: 9600 (по умолчанию), 19200, 31250 (MIDI), 38400

Пример кода:

#include <NeoSWSerial.h>
NeoSWSerial neoSerial( 2, 3 );

void setup()
{
  neoSerial.begin(9600);
  neoSerial.println("Hello World");
}

void loop()
{
}

Руководство по выбору библиотеки

Выбор зависит от конкретных требований:

  • Высокие скорости (115200+): только Hardware Serial

  • Доступны пины 8 и 9: AltSoftSerial

  • Стандартные скорости, другие пины: NeoSWSerial

  • Нет альтернатив: SoftwareSerial

  • Несколько быстрых подключений: Arduino Mega

Настройка USB-to-Serial адаптера

Для отладки без использования аппаратного Serial подключите адаптер к пинам программного Serial. Это создаёт второй COM-порт на ПК.

USB-to-Serial адаптеры USB-to-Serial адаптеры — подключение USB-to-Serial адаптеры — варианты

Базовый скетч «проходного моста» (Pass-Through):

#include <AltSoftSerial.h>
AltSoftSerial softSerial;
char c=' ';

void setup()
{
    Serial.begin(9600);
    while(!Serial);
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    softSerial.begin(9600);
    Serial.println("AltSoftSerial started at 9600");
}

void loop()
{
    if (softSerial.available())
    {
        c = softSerial.read();
        Serial.write(c);
    }

    if ( Serial.available() )
    {
        c = Serial.read();
        softSerial.write(c);
    }
}
Скриншот — настройка USB-to-Serial Скриншот — COM-порты Скриншот — терминал Скриншот — передача данных Скриншот — двунаправленная связь Скриншот — результат работы

Связь Arduino-Arduino

Две платы Arduino могут общаться через серийное соединение. Подключите RX одной к TX другой и свяжите пины GND. Загрузите скетч «проходного моста» на обе платы и откройте отдельные Serial Monitor для каждой.

Связь Arduino-Arduino — схема Связь Arduino-Arduino — макетная плата

Тот же скетч «проходного моста» обеспечивает двунаправленную связь между платами без модификации.

Arduino-Arduino — скриншот 1 Arduino-Arduino — скриншот 2 Arduino-Arduino — скриншот 3 Arduino-Arduino — скриншот 4

Оригинал статьи: martyncurrey.com