ELECTRONICS

Библиотека SoftwareSerial

встроена в средуArduino, встроенаверсия ядро AVR 1.8.8

Второй последовательный порт на любых выводах: для GPS, Bluetooth и GSM-модулей, пока аппаратный занят компьютером.

У UNO один аппаратный порт, и он уходит на USB: если посадить на него GPS, монитор порта покажет мусор, а прошивка перестанет заливаться. SoftwareSerial делает порт программно на двух любых выводах, отдавая под это процессорное время.

Ограничения серьёзные: надёжно работает до 38400 бод, слушать может только один такой порт за раз, и во время приёма байта всё остальное на плате замирает. Если модулей несколько или скорость выше — берите Mega с четырьмя аппаратными портами.

Установка и подключение

Ставить ничего не нужно: библиотека входит в среду Arduino и доступна сразу после установки. Достаточно строки подключения в начале скетча.

#include <SoftwareSerial.h>

Создание объекта — обычно до setup():

SoftwareSerial gps(4, 3);      // RX платы, TX платы: RX ← TX модуля
gps.begin(9600);                // в setup()

Методы

Только то, что нужно в обычном скетче. Сигнатуры сверены с версией ядро AVR 1.8.8.

begin(long baud)
Запустить порт на скорости. Практический потолок 38400, надёжно 9600.
available()
Сколько байт принято и ждёт чтения. Буфер 64 байта.
read()
Прочитать байт; −1, если пусто.
peek()
Посмотреть следующий байт, не забирая его.
write(uint8_t b) / print(...) / println(...)
Отправить байт, текст или число — как у Serial.
listen()
Сделать этот порт активным — принимать может только один SoftwareSerial.
isListening()
Активен ли этот порт.
overflow()
true, если буфер переполнился и байты потерялись. Сбрасывается при чтении флага.
end()
Остановить порт, вернуть выводы.

Пример

#include <SoftwareSerial.h>

SoftwareSerial modem(4, 3);   // D4 ← TX модуля, D3 → RX модуля

void setup() {
  Serial.begin(9600);         // к компьютеру
  modem.begin(9600);          // к модулю
  Serial.println("Мост готов: печатайте команды");
}

void loop() {
  // всё с компьютера — в модуль, всё из модуля — на компьютер
  if (Serial.available())  modem.write(Serial.read());
  if (modem.available())   Serial.write(modem.read());
}

Такой «мост» — первое, что делают с любым модулем на UART: через него вручную шлют AT-команды и видят ответы.

На чём попадаются

Принимает мусор

Скорость не совпадает с модулем или выше 38400. Второй вариант — TX и RX перепутаны: TX модуля идёт на RX платы.

Теряются байты

Буфер 64 байта, и пока скетч занят delay(), он переполняется. Читайте чаще и избегайте длинных задержек.

Два порта, работает один

Слушать может один. Переключайте listen() и учитывайте, что во время переключения принятое другим портом теряется.

На Mega и ESP32 не нужна

У Mega есть Serial1–Serial3, у ESP32 — Serial1 и Serial2 на любых выводах. Программный порт там хуже аппаратного.

Где используется на сайте

Что дальше