Arduino.ru
Инициирует последовательное соединение и задает скорость передачи данных в бит/c (бод). Для обмена данными с компьютером используйте следующие значения: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200. При соединение через порты вход/выхода 0 и 1 могут быть использованы другие значения скорости, требуемые устройством с которым будет осуществляться обмен данными.
Синтаксис
Serial.begin(speed)
Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed)
Параметры
- speed: скорость в бит/c (бод). (long)
Возвращаемое значение
Пример
void setup() < Serial.begin(9600); // открывает последовательный порт, устанавливает скорость 9600 бит/c >void loop() <>
Пример для Ардуино Мега:
// Arduino Mega пример использования всех 4 последовательных портов // (Serial, Serial1, Serial2, Serial3), // с разными скоростями: void setup() < Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200); Serial3.begin(4800); Serial.println("Hello Computer"); Serial1.println("Hello Serial 1"); Serial2.println("Hello Serial 2"); Serial3.println("Hello Serial 3"); >void loop() <>
Работа с последовательным портом UART (serial) на Arduino
Последовательный интерфейс (serial) предназначен передачи данных через универсальный асинхронный порт UART. Порт UART очень часто используется для передачи данных с Ардуино на компьютер, и обратно, а также для связи нескольких плат ардуин между собой.
Для многопортовых DUE/MEGA см. здесь.
Основные функций для работы с последовательным портом (Serial)
Serial.begin(rate) — Открывает последовательный порт и задаёт скорость для последовательной передачи данных. Типичная скорость обмена для компьютерной коммуникации — 9600.
Очевидно, когда задействован последовательный порт, выводы 0 (RX) и 1 (TX) не могут использоваться для других целей.
Serial.println(data) — Передаёт данные в последовательный порт, сопровождая автоматическим возвратом каретки и переходом на новую строку.
Serial.print(data) — тоже самое без возврата каретки и перехода на новую строку.
Serial.begin(скорость_передачи); — Инициализация порта. Задает скорость передачи в битах в секунду. Нормированные скорости: 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, или 115200.
count = Serial.available(); — Принимаемые по последовательному порту байты попадают в буфер микроконтроллера, откуда Ваша программа может их считать. Функция возвращает количество накопленных в буфере байт. Последовательный буфер может хранить до 128 байт.
if (Serial.available() > 0) < // Если в буфере есть данные // здесь должен быть прием и обработка данных >
char = Serial.read(); — Считывает следующий байт из буфера последовательного порта. возвращает -1 если нет входящих данных
Serial.flush(); — Ожидает окончания передачи исходящих данных (до версии Arduino 1.0 функция очищала буфер последовательного соединения)..
Разные варианты функции print:
Serial.print(b, DEC); — выводит ASCII-строку — десятичное представление числа b.
Serial.print(b, BYTE) — выводит младший байт числа b.
(аналогично HEX, OCT, BIN).
Serial.print(str) // если str — строка или массив символов, побайтно передает str на COM-порт.
Serial.println(); — отличие заключается в том, что после данных дополнительно выводятся два символа – символ возврата каретки (ASCII 13, или ‘\r’) и символ новой линии (ASCII 10, или ‘\n’).
Функция write:
Serial.write(uint8_t c); — Записывает данные в последовательный порт. Данные посылаются как байт или последовательность байт.
Serial.write(val); // где val — переменная для передачи, как единственный байт
Serial.write(str); // где str — строка для передачи, как последовательность байт
Serial.write(buf, len); // где buf — массив для передачи, как последовательность байт; len — длина массива.
Пример 1. Передача данных по Serial-порту с Arduino на компьютер
Инициализация порта со скоростью 9600 бот и передача данных (от Arduino на внешние устройства, например на компьютер):
void setup() < Serial.begin(9600); // открывает порт и устанавливает скорость 9600 бит/c Serial.println("Hello Computer"); >void loop() <>
Пример 2. Передача данных по Serial-порту с компьютера на Arduino
serialEvent() — функция вызывается автоматически, когда поступают данные.
String inputString = ""; void serialEvent() < // Далем что то с поступившими данными while (Serial.available()) < char inChar = (char)Serial.read(); // get the new byte inputString += inChar; if (inChar == '\n') < stringComplete = true; >>
Serial.setTimeout() — задает максимальное время (в мс) для работы Serial.readBytesUntil();
Возможные проблемы
1) auto-reboot DTR : возможна автоперезагрузка МК при передаче на него данных по serial-пору. Чтобы отключить это, надо поставить конденсатор 10мкФ между RES и GND. Я ставил электролитический кондер (естественно, + на RES).
Как соединить две ардуины по UART (serial) порту
Схема соединения двух ардуин:
Длина провода и скорость: RS-232 (англ. Recommended Standard 232) — стандарт физического уровня для асинхронного интерфейса (UART).
Расстояние связи по RS232 максимум 15 метров.
Но всё зависит от скорости.
Работа Arduino MEGA/DUE с несколькими последовательными serial портами
Многопортовые ардуино.
Как вы уже заметили, на ардуиновских платах Mega и Due имеется по 4 последовательных порта, а именно:
Serial — выводы 0 (RX) and 1 (TX);
Serial1 — выводы 19 (RX) and 18 (TX);
Serial2 — выводы 17 (RX) and 16 (TX);
Serial3 — выводы 15 (RX) and 14 (TX).
Естественно, что на Due используется напряжение 3.3 В (на MEGA как обычно 5 В).
Как с ними работать?
Здесь синим цветом выделены собственно имена объектов ( Serial , Serial1 , Serial2 , Serial3 ), которые используются в коде программы для работы с их методами. Всё просто! Например,
// Пример работы с несколькими serial-портами: void setup() < // инициализируем те порты, котор: Serial.begin(9600); Serial1.begin(9600); Serial2.begin(9600); Serial3.begin(9600); >// и так же с ними работаем: void loop() < // выводим строку в порт-2: Serial2.print("Hello World!"); // читаем данные из порта-1 и пишем в порт-3: if (Serial1.available()) < int inByte = Serial1.read(); Serial3.write(inByte); >>
Пример вывода на дисплей LCD1602 через последовательный порт UART Arduino из-под Linux средствами языка Python
Короче говоря, есть комп с линуксом, к которому подключена Arduino через USB, а к арудине подключен дисплей LCD1602, и мы хотим на него выводить инфу.
Сначала привожу полный код программы для Arduino UNO, к которой подключен дисплей LCD1602:
#include < LiquidCrystal_I2C.h > LiquidCrystal_I2C lcd(0x27,16,2); /* или 0x3F. */ const char TERM_SYMBOL = '#'; String inputString = ""; void serialEvent() < while (Serial.available()) < char inChar = (char)Serial.read(); // get the new byte Serial.print(inChar); if (inChar != TERM_SYMBOL) < inputString += inChar; >else < lcd.setCursor(0, 0); lcd.print(inputString); // Выводим текст inputString = ""; >> > void setup() < Serial.begin(9600); Serial.println("Hi Computer"); lcd.init(); // Инициализация lcd.backlight(); // Включаем подсветку lcd.print("Ready to work"); // Выводим текст >void loop() // цикл
Я сделал здесь решетку ‘#’ в качестве символа завершения передачи пакета данных. Как только в потоке данных встречается символ #, данные выводятся на дисплей, и буфер обнуляется, при этом сам символ ‘#’ не выводится. Конечно, можно было бы использовать ‘\n’ или др.
Далее мы напишем скрипт на Python, который будет выводить инфу на дисплей. Я выбрал Python, потому что это прикладной язык и он лучше всего подходит для подобных задач. С такими языками как C++/C# и т.п. больше возни с библиотеками, а здесь всё просто, особенно если это дело происходит под линуксом.
Первым делом устанавливаем необходимые библиотеки (для 2-ой или 3-ей версии python)
$sudo apt-get install python-serial
$sudo apt-get install python3-serial
Далее в интерпретаторе python пишем:
import serial ser = serial.Serial("/dev/ttyUSB0") ser.baudrate = 9600 ser.write(' #') # очищаем строку ser.write("123; It's work#") # выводим какие-либо данные
Здесь ардуина у меня подключена к порту /dev/ttyUSB0 — это я узнавал из Arduino IDE. Обычно она всегда на этом порту сидит, если других устройств на последовательный порт не подключено.
Как вы уже догадались, и в первой, и во второй программы должна быть указано одинаковая скорость в бодах. В моем случае это 9600 — стандартная, хотя и маленькая скрость. Может быть и больше (читай выше).
Платы ARDUINO по низкой цене
Нажми на изображение, чтобы заказать в интернет-магазине:
Now 05.02.24 2:52:18, Your IP: 45.82.33.202; arduino.zl3p.com/basic/serial
ePN
Что означает команда serial begin 9600
Задает скорость передачи данных по последовательному интерфейсу в битах в секунду (бодах). Для взаимодействия с компьютером следует использовать одну из предустановленных скоростей обмена: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200. Тем не менее, можно задавать и другие скорости — например, для взаимодействия с каким-либо специфичным компонентом посредством выводов 0 и 1.
Необязательный второй аргумент этой функции позволяет настроить количество бит данных, проверку четности и стоповые биты. По умолчанию, посылка состоит из 8 бит данных, без проверки четности, с одним стоповым битом.
Синтаксис
Serial.begin(speed) Serial.begin(speed, config)
Только для Arduino Mega:
Serial1.begin(speed) Serial2.begin(speed) Serial3.begin(speed) Serial1.begin(speed, config) Serial2.begin(speed, config) Serial3.begin(speed, config)
Параметры
speed: скорость в битах в секунду (бодах) — long
config: задает количество бит данных, проверку четности и стоповые биты. Ниже приведен список возможных значений:
- SERIAL_5N1
- SERIAL_6N1
- SERIAL_7N1
- SERIAL_8N1 (по умолчанию)
- SERIAL_5N2
- SERIAL_6N2
- SERIAL_7N2
- SERIAL_8N2
- SERIAL_5E1
- SERIAL_6E1
- SERIAL_7E1
- SERIAL_8E1
- SERIAL_5E2
- SERIAL_6E2
- SERIAL_7E2
- SERIAL_8E2
- SERIAL_5O1
- SERIAL_6O1
- SERIAL_7O1
- SERIAL_8O1
- SERIAL_5O2
- SERIAL_6O2
- SERIAL_7O2
- SERIAL_8O2
Возвращаемые значения
Пример
void setup() < Serial.begin(9600); // открываем последовательный порт, задаем скорость передачи данных 9600 бод >void loop() <>
Пример для Arduino Mega:
// В Arduino Mega используются все четыре последовательных порта // (Serial, Serial1, Serial2, Serial3), // с различной скоростью обмена данными: void setup() < Serial.begin(9600); Serial1.begin(38400); Serial2.begin(19200); Serial3.begin(4800); Serial.println("Hello Computer"); Serial1.println("Hello Serial 1"); Serial2.println("Hello Serial 2"); Serial3.println("Hello Serial 3"); >void loop() <>
Ардуино для начинающих. Урок 10. Serial и processing

Теперь сделаем кое что посложнее. Сейчас напишем скетч для управления, встроенным в Arduino, светодиодом с компьютера через Serial интерфейс. Этот скетч не намного сложнее предыдущего:
// Управление светодиодом с компьютера int ledPin = 13; void setup () < // Открываем порт на скорости 9600 бод Serial.begin(9600); // Назначаем пин светодиода выходом pinMode(ledPin, OUTPUT); >void loop () < // Ждем данные while (Serial.available() == 0); // Считываем данные int val = Serial.read() - '0'; // Выполняем дествия в зависимости от данных if (val == 1) < Serial.println("Led is On"); digitalWrite(ledPin, HIGH); >else if (val == 0) < Serial.println("Led is Off"); digitalWrite(ledPin, LOW); >else < Serial.println("Invalid!"); >// Очищаем буфер Serial.flush(); >
Тут вы не найдете ничего нового, что мы бы не разбирали в этом или прошлых уроках, кроме Serial.flush(). Этот метод очищает оставшиеся символы в буфере памяти, так как мы работаем только с одним символом и остальные нам не нужны. В видео подробно рассказано зачем эта строчка.
А теперь приступим к самому интересному и сложному на сегодня. Теперь мы будем отправлять значения с Ардуино на компьютер и там их использовать. Для обработки получаемых значений на компьютере мы будем использовать Processing. Скачать его можно на официальном сайте.
Схема очень проста. Мы просто подключим потенциометр к аналоговому пину Arduino. Скетч тоже очень прост:
int potPin = 0; void setup () < Serial.begin(9600); >void loop () < // Считываем и преобразовываем данные int val = map(analogRead(potPin), 0, 1023, 0, 255); // Отправляем данные Serial.println(val); // Задержка для стабильности работы delay(50); >
Если вы прошли прошлые уроки, то в этом скетче вам все будет понятно. Если вы что то не знаете или забыли можете посмотреть прошлые уроки или справочник по языку программирования ардуино. А вот и код для Processing:
// Подключаем библиотеку монитора порта import processing.serial.*; // Инициируем порт Serial port; // Переменная для хранения значения яркости float brightness = 0; void setup () < // Задаем размер окна size(500, 500); // Слушаем ком порт СОМ3 port = new Serial(this, "COM3", 9600); port.bufferUntil('\n'); >void draw () < // Изменяем цвет фона окна background(0, 0, brightness); >// Получаем значения с ардуино void serialEvent (Serial port)
Описывать этот код я не буду, так как в видео все подробно изложено, да и практически каждая строчка кода пояснена комментарием.
5 комментариев
- Влад 2018-12-05 18:34:19
Не работает Serial.flash(). Вместо одной выходят несколько надписей Invaild. Что делать?
Влад, поменяй одну букву в слове Serial.flash()
Должно быть: Serial.flush()
В предпоследнюю строку последнего скетча вкралась опечатка.
Вместо redString в операторе brightness = float(port.redStringUntil(‘\n’)); там имелось в виду
readString, т.е. brightness = float(port.readStringUntil(‘\n’));
А как в процессинге работать с 2-3-4…. Ком портами ?
И как обмениваться float ?
подскажите пожалуйста как принимать 10 разных значений?
чем их разделить или может передавать последовательно?
требуется передать данные с разных датчиков а приняв отобразить в нужных местах. форму в Processing нарисовал, осталось продумать как в нужном порядке передать через Serial (использую Bluetooth) и приняв «разложить по полочкам»
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Железо

Стартовый набор с Arduino Mega и RFID Это расширенный стартовый набор. В комплект входит Arduino Mega R3, макетные платы, множество датчиков, управляемые механизмы и необходимые радиоэлектронные компоненты. Полный список.

Плата Arduino Uno R3 Arduino Uno — плата на базе микроконтроллера ATmega328P с частотой 16 МГц. На плате есть все необходимое для удобной и быстрой работы.