Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека SoftwareSerial

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

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

Среди известных ограничений библиотеки 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

SoftwareSerial() - перед началом работы необходимо вызвать класс с указанием портов для получения и отправки последовательных данных.


SoftwareSerial(rxPin, txPin);

SoftwareSerial.available() возвращает количество непрочитанных байт (символов), принятых через программный последовательный порт. Непрочитанные данные накапливаются во входном последовательном буфере.

SoftwareSerial.begin(speed) задаёт скорость передачи данных (в бодах) последовательного порта. Поддерживаемые значения: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600 и 115200. Возвращаемого значения нет.

SoftwareSerial.isListening() - проверяет, выступает ли выбранный порт в данный момент в качестве "слушателя" данных. Возвращаемое значение: false или true.

SoftwareSerial.listen() - назначает выбранный порт в качестве "слушателя" данных, при этом только один последовательный порт может слушать одновременно — данные, которые прибывают для других портов, будут отвергнуты. Любые данные, которые уже получены, во время вызова listen() отбрасываются (если данный экземпляр уже не слушает). Возвращаемого значения нет.

SoftwareSerial.overflow() проверяет, произошло ли переполнение буфера для данного экземпляра последовательного порта. Размер буфера 64 байта. Вызов этой функции очищает флаг переполнения. Возвращаемое значение: false или true.

SoftwareSerial.peek() возвращает символ, принятый программным последовательным портом через вывод RX. Однако, в отличие от read(), многократный вызов данной функции будет приводить к получению одного и того же значения. Следует иметь ввиду, что в каждый момент времени принимать поступающие данные может только один программный порт. Для выбора принимающего порта (экземпляра класса SoftwareSerial) используйте функцию listen(). Возвращает полученный символ, или -1, если такового нет.

SoftwareSerial.read() возвращает символ, принятый программным последовательным портом через вывод RX. Следует иметь ввиду, что в каждый момент времени принимать поступающие данные может только один программный порт. Для выбора принимающего порта (экземпляра класса SoftwareSerial) используйте функцию listen(). Возвращает полученный символ, или -1, если такового нет.

SoftwareSerial.print() выводит данные через вывод TX программного последовательного порта. Работа данной функции аналогична функции Serial.print(). Возвращает количество отправленных байт (byte). Считывание этого значения не обязательно.

SoftwareSerial.println() Выводит данные через вывод TX программного последовательного порта с последующим символом возврата каретки и перевода строки. Работа данной функции аналогична функции Serial.println(). Параметры могут варьироваться. Возвращает количество отправленных байт (byte). Считывание этого значения не обязательно.

SoftwareSerial.write() выводит данные в виде последовательности байт через вывод TX программного последовательного порта. Работа данной функции аналогична функции Serial.write(). Параметры могут варьироваться. Возвращает количество записанных байт (byte). Считывание этого значения не обязательно.

Пример


/*
  Программа тестирования последовательных портов, создаваемых с помощью 
  библиотеки 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). 
   
*/

#include <SoftwareSerial.h>
 
SoftwareSerial mySerial(10, 11); // RX, TX
 
void setup()  
{
  // Инициализируем последовательный интерфейс и ждём открытия порта:
  Serial.begin(57600);
  while (!Serial) {
    ; // ожидаем подключения к последовательному порту. Необходимо только для Leonardo
  }
  
  Serial.println("Goodnight moon!");
 
  // устанавливаем скорость передачи данных для последовательного порта
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}
 
void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Второй пример на сайте Arduino.

Реклама