Библиотека SoftwareSerial
Второй последовательный порт на любых выводах: для 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 на любых выводах. Программный порт там хуже аппаратного.