Arduino и набор функций Serial
Набор функций Serial служит для связи устройства Arduino с компьютером или другими устройствами, поддерживающими последовательный интерфейс обмена данными. Все платы Arduino имеют хотя бы один последовательный порт UART. Для обмена данными Serial служат цифровые порты ввода/вывода 0 (RX) и 1 (TX), а также порт USB. Важно учитывать, что если вы используете функции Serial, то нельзя одновременно с этим задействовать порты 0 и 1 для других целей.
Среда разработки Arduino имеет встроенный монитор последовательного интерфейса (Serial monitor), показанный на рисунке. Для начала обмена данными необходимо запустить монитор нажатием кнопки Serial monitor и выставить ту же скорость связи (baud rate), с которой вызвана функция begin().
Монитор последовательного порта
Плата Arduino Mega имеет три дополнительных последовательных порта: Serial1 на портах 19 (RX) и 18 (TX), Serial2 на портах 17 (RX) и 16 (TX), Serial3 на портах 15 (RX) и 14 (TX). Чтобы использовать эти порты для связи с компьютером, понадобятся дополнительные адаптеры USB-to-serial, т. к. они не подключены к встроенному адаптеру платы Mega.
Функции библиотеки Serial
Функция Serial.begin()
Функция Serial.begin() инициирует последовательное соединение и задает скорость передачи данных в бит/c (бод). Для обмена данными с компьютером используйте следующие значения: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200. При соединении через порты входа/выхода 0 и 1 могут быть использованы другие значения скорости, требуемые устройством, с которым будет осуществляться обмен данными.
Синтаксис функции Serial.begin(): Serial.begin(speed)
Для Arduino Mega и Arduino Due:
Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)
Параметр: speed — скорость в бит/c (бод) (long). Возвращаемого значения нет.
Функция Serial.end()
Функция Serial.end() закрывает последовательное соединение, порты RX и TX освобождаются и могут быть использованы для ввода/вывода.
Синтаксис функции Serial.end(): Serial.end()
Для Arduino Mega и Arduino Due:
Serial1.end() Serial2.end() Serial3.end()
Параметра нет. Возвращаемого значения нет.
Функция Serial.available()
Функция Serial.available() получает количество байтов (символов), доступных для чтения из последовательного интерфейса связи. Это те байты, которые уже поступили и записаны в буфер последовательного порта. Буфер может хранить до 128 байтов.
Синтаксис функции Serial.available(): Serial. available()
Для Arduino Mega и Arduino Due:
Serial1.available() Serial2.available() Serial3.available()
Параметра нет.
Возвращаемое значение — количество байтов, доступных для чтения (int).
Функция Serial.read()
Функция Serial.read() cчитывает очередной доступный байт из буфера последовательного соединения.
Синтаксис функции Serial.read(): Serial.read()
Для Arduino Mega и Arduino Due:
Serial1.read() Serial2.read() Serial3.read()
Параметра нет.
Возвращаемое значение — cледующий доступный байт или -1, если его нет (int).
Примеры использования функций Serial.available() и Serial.read() представлены.
int in=0; // переменная для хранения полученного байта
void setup() {
Serial.begin(9600); // устанавливаем последовательное соединение
}
void loop()
{
if (Serial.available() > 0) // если есть доступные данные
{
// считываем байт in = Serial.read();
// отсылаем то, что получили Serial.println(in,DEC);
}
}
Функция Serial.flush()
Функция Serial.flush() ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения).
Синтаксис функции Serial.flush(): Serial.flush()
Для Arduino Mega и Arduino Due:
Serial1.flush() Serial2.flush() Serial3.flush()
Параметра нет. Возвращаемого значения нет.
Функция Serial.print()
Функция Serial.print() передает данные через последовательный порт как текст ASCII. Эта функция может принимать различные типы данных. С помощью второ- го опционального параметра можно задать базис (систему счисления) для чисел.
Синтаксис функции Serial.print():
Serial.print(val) Serial.print(val, format)
Для Arduino Mega и Arduino Due: Serial1, Serial2, Serial3.
Параметры:
val — данные для передачи через последовательное соединение;
format — базис для целых чисел или количество знаков после запятой для вещественных:
• BYTE;
• BIN (двоичный);
• OCT (восьмеричный);
• DEC (десятеричный);
• HEX (шестнадцатеричный);
• для вещественных (дробных) чисел второй параметр задает количество знаков после запятой.
Возвращаемого значения нет.
Функция Serial.println()
Функция Serial.println() передает данные через последовательный порт как текст ASCII вместе со следующим за ним символом переноса строки (символ ASCII 13 или '\r') и символом новой строки (ASCII 10 или '\n'). Пераметры и типы данных для этой функции такие же, как и для функции Serial.print().
Функция Serial.write()
Функция Serial.write() передает данные как бинарный код через последовательное соединение. Данные посылаются единичным байтом или серией байтов. Для того, чтобы передать данные как символы, следует использовать другую функцию — print().
Синтаксис функции Serial.write():
Serial.write(val) Serial.write(str) Serial.print(buf, len)
Для Arduino Mega: Serial1, Serial2, Serial3. Параметры:
val — один байт;
str — строка как серия байтов;
buf — массив байтов;
len — длина массива. Возвращаемого значения нет.
Функция Serial.peek()
Функция Serial.peek() возвращает следующий доступный байт (символ) из буфера входящего последовательно соединения, не удаляя его из этого буфера. То есть успешный вызов этой фунции вернет то же значение, что и следующий за ним вызов функции read().
Синтаксис функции Serial.peek(): Serial.peek()
Для Arduino Mega и Arduino Due:
Serial1.peek() Serial2.peek() Serial3.peek()
Параметра нет.
Возвращаемое значение — cледующий доступный байт или -1, если его нет (int).
Библиотека SoftwareSerial
Библиотека SoftwareSerial позволяет осуществить последовательную передачу данных через другие цифровые контакты Arduino. Можно иметь несколько про- граммных последовательных портов со скоростью до 115 200 битов. Программное обеспечение SoftwareSerial копирует функциональность библиотеки Serial (отсюда и название "SoftwareSerial"), но с некоторыми ограничениями:
при использовании нескольких программных последовательных портов только один может принимать данные одновременно;
на платах Mega и Mega 2560 для 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);
на плате Leonardo для RX могут быть использованы только следующие контакты: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
Библиотека SoftwareSerial включает следующие функции:
SoftwareSerial();
available();
begin();
isListening();
overflow();
peek();
read();
print();
println();
listen();
write().
В целом эти функции аналогичны функциям библиотеки Serial, поэтому далее мы рассмотрим только функции, уникальные для библиотеки SoftwareSerial.
Функция SoftwareSerial()
Функция SoftwareSerial() создает экземпляр объекта последовательного порта SoftwareSerial. Для запуска последовательного порта на выводах rxPin, txPin необходимо выполнить функцию SoftwareSerial.begin().
Синтаксис функции SoftwareSerial(): SoftwareSerial(rxPin, txPin)
Параметры:
rxPin — вывод для получения последовательных данных;
txPin — вывод для отправки последовательных данных. Возвращаемое значение — экземпляр объекта SoftwareSerial.
Функция SoftwareSerial.listen()
Функция SoftwareSerial.listen() назначает выбранный порт в качестве "слушателя" данных, при этом только один последовательный порт программное обеспечение может слушать одновременно — данные, которые прибывают для других портов, будут отвергнуты. Любые данные, которые уже получены, во время вызова listen() отбрасываются (если данный экземпляр уже не слушает).
Синтаксис функции SoftwareSerial.listen(): SoftwareSerial.listen(port)
Параметра нет. Возвращаемого значения нет.
Функция SoftwareSerial.isListening()
Функция SoftwareSerial.isListening() проверяет, выступает ли выбранный порт в данный момент в качестве "слушателя" данных.
Синтаксис функции SoftwareSerial.isListening(): SoftwareSerial.isListening()
Параметра нет.
Возвращаемое значение — boolean: false или true.
Примеры назначения порта слушателем и проверки его состояния
#include <SoftwareSerial.h>
// software serial : TX = digital pin 10, RX = digital pin 11 SoftwareSerial portOne(10, 11);
// software serial : TX = digital pin 8, RX = digital pin 9 SoftwareSerial portTwo(8, 9);
void setup()
{
Serial.begin(9600);
// Start both software serial ports portOne.begin(9600); portTwo.begin(9600);
}
void loop()
{
portOne.listen();
if (portOne.isListening())
{Serial.println("Port One is listening!");} else
{Serial.println("Port One is not listening!");}
if (portTwo.isListening())
{Serial.println("Port Two is listening!");} else
{Serial.println("Port Two is not listening!");}
}
Функция SoftwareSerial.overflow()
Функция SoftwareSerial.overflow() проверяет, произошло ли переполнение буфера для данного экземпляра последовательного порта. Размер буфера 64 байта. Вызов этой функции очищает флаг переполнения.
Синтаксис функции SoftwareSerial.overflow(): SoftwareSerial.overflow()
Параметра нет.
Возвращаемое значение — boolean: false или true.