На главную страницу | Новости | FAQ | Ссылки | Для детей | Контакты
Последовательный интерфейс (serial) предназначен передачи данных через универсальный асинхронный порт UART. Порт UART очень часто используется для передачи данных с Ардуино на компьютер, и обратно, а также для связи нескольких плат ардуин между собой.
Для многопортовых DUE/MEGA см. здесь.
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 функция очищала буфер последовательного соединения)..
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').
Serial.write(uint8_t c); -- Записывает данные в последовательный порт. Данные посылаются как байт или последовательность байт.
Serial.write(val); // где val - переменная для передачи, как единственный байт
Serial.write(str); // где str - строка для передачи, как последовательность байт
Serial.write(buf, len); // где buf - массив для передачи, как последовательность байт; len - длина массива.
Инициализация порта со скоростью 9600 бот и передача данных (от Arduino на внешние устройства, например на компьютер):
void setup() {
Serial.begin(9600); // открывает порт и устанавливает скорость 9600 бит/c
Serial.println("Hello Computer");
}
void loop() {}
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)
1-ая ---- 2-ая
GND <---> GND
RX <---> TX
TX <---> RX
Длина провода и скорость: RS-232 (англ. Recommended Standard 232) -- стандарт физического уровня для асинхронного интерфейса (UART).
Расстояние связи по RS232 максимум 15 метров.
Но всё зависит от скорости.
подробнее здесь
http://robotic-controls.com/learn/arduino/arduino-arduino-serial-communication
Как вы уже заметили, на ардуиновских платах Mega и Due имеется по 4 последовательных порта, а именно:
Естественно, что на Due используется напряжение 3.3 В (на MEGA как обычно 5 В).
Как с ними работать?
Здесь синим цветом выделены собственно имена объектов (
// Пример работы с несколькими 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);
}
}
Короче говоря, есть комп с линуксом, к которому подключена 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() // цикл
{
}
Скачать исходник.
Я сделал здесь решетку
Далее мы напишем скрипт на 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 - стандартная, хотя и маленькая скрость. Может быть и больше (читай выше).
Now 21.11.24 16:24:58, Your IP: 13.59.73.248; arduino.zl3p.com/basic/serial
ePN