Библиотека SoftwareSerial

В Ардуино реализована аппаратная поддержка интерфейса последовательной передачи данных через выводы 0 и 1 (которые также используются для связи с компьютером посредством USB). Аппаратная работа с последовательным интерфейсом осуществляется с помощью встроенного в микроконтроллер специального устройства, называемого приемопередатчиком UART. Он позволяет микроконтроллеру Atmega обрабатывать поступающие данные даже во время работы над другими задачами.

Библиотека SoftwareSerial позволяет реализовать последовательный интерфейс на любых цифровых выводах Ардуино с помощью программных средств, дублирующих функциональность UART (отсюда и название "SoftwareSerial"). Библиотека позволяет программно создавать несколько последовательных портов, работающих на скорости до 115200 бод. Для устройств, работающих с инвертированным сигналом, в библиотеке предусмотрен соответствующий параметр, включающий инвертирование.

Начиная с версии 1.0, SoftwareSerial основывается на библиотеке NewSoftSerial автора Mikal Hart.

Ограничения

Среди известных ограничений библиотеки SoftwareSerial можно перечислить следующие:

  • При использовании нескольких последовательных портов, в каждый момент времени только один из них может получать данные.
  • На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. В силу этого, на данных платах в качестве вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
  • На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

Пример

/*
  Программа тестирования последовательных портов, создаваемых с помощью 
  библиотеки SoftwareSerial
 
 Данные, получаемые аппаратным портом, отправляются на программный порт.
 Данные, получаемые программным портом, отправляются на аппаратный порт.
 
 Схема: 
 * RX - цифровой вывод 10 (необходимо соединить с выводом TX другого устройства)
 * TX - цифровой вывод 11 (необходимо соединить с выводом RX другого устройства)
 
 Примечания:
 На платах Arduino Mega и Mega2560 некоторые выводы не поддерживают прерывания, 
 возникающие при изменении уровня сигнала. Поэтому, на данных платах в качестве 
 вывода RX могут использоваться только следующие выводы: 10, 11, 12, 13, 14, 15, 50, 
 51, 52, 53, A8 (62), A9 (63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).


 На Arduino Leonardo некоторые выводы не поддерживают прерывания, возникающие при 
 изменении уровня сигнала. Поэтому, на этой плате в качестве вывода RX могут 
 использоваться только следующие выводы: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). 
 
 дата создания не известна
 модифицировано 25 мая 2012
 Автор: Tom Igoe
 на основе примера Mikal Hart
 
 Данный код открыт для использования.
 
 */
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()  
{
  // Инициализируем последовательный интерфейс и ждем открытия порта:
  Serial.begin(57600);
  while (!Serial) {
    ; // ожидаем подключения к последовательному порту. Необходимо только для Leonardo
  }


  Serial.println("Goodnight moon!");

  // устанавливаем скорость передачи данных для последовательного порта, созданного 
  // библиотекой SoftwareSerial
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // выполняется циклически
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Функции