Arduino Serial: Обзор различных библиотек Serial
Платы Arduino имеют несколько реализаций последовательного UART с различными характеристиками производительности. Понимание различных библиотек Serial помогает разработчикам выбрать правильное решение для конкретных коммуникационных задач.
Hardware Serial (Аппаратный Serial)
Наиболее надёжная реализация Serial использует выделенные пины RX и TX (пины 0 и 1 на большинстве плат). Все платы Arduino имеют как минимум один аппаратный серийный канал. Некоторые платы имеют больше — например, Arduino Mega предоставляет четыре аппаратных серийных канала.
Ключевые преимущества:
Лучшая производительность, наиболее надёжная и стабильная работа
Возможность одновременной передачи и приёма
Работает во время выполнения других задач 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-порт на ПК.
Базовый скетч «проходного моста» (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);
}
}
Связь Arduino-Arduino
Две платы Arduino могут общаться через серийное соединение. Подключите RX одной к TX другой и свяжите пины GND. Загрузите скетч «проходного моста» на обе платы и откройте отдельные Serial Monitor для каждой.
Тот же скетч «проходного моста» обеспечивает двунаправленную связь между платами без модификации.
Оригинал статьи: martyncurrey.com