LAB #2. Библиотека COM-port
Объект Serial.
Вывод данных через Com-port

Основы работы
COM-порт в Arduino реализуется через интерфейс UART (Universal Asynchronous Receiver/Transmitter), который позволяет обмениваться данными с компьютером или другими устройствами.

Подключение и настройка
  • Пины подключения: RX (прием) - пин 0, TX (передача) - пин 1
  • При работе с COM-портом эти пины нельзя использовать для других целей
  • Связь осуществляется через USB-UART преобразователь
void setup() {
    Serial.begin(9600);  // Инициализация на скорости 9600 бод
}
Бод (Baud) — это единица измерения скорости передачи информации в последовательных портах (COM-портах). Названа в честь французского инженера Эмиля Бодо, создателя телеграфного аппарата.
Важно понимать разницу между бодами и битами в секунду (bps):
  • Боды измеряют количество изменений сигнала в секунду
  • Bps измеряет чистую скорость передачи данных без учета служебных битов

В контексте COM-порта:

При передаче данных каждый байт сопровождается дополнительными битами: стартовым, стоповым и иногда битом четности. Эти дополнительные биты учитываются при измерении в бодах


  • Максимальная скорость передачи данных через стандартный COM-порт составляет 115 200 бод, стандартная для Arduino (если не использовать дополнительные настройки) - 9600 Бод
  • При использовании специальных преобразователей (например, RS-232-RS-485) и кабеля типа “витая пара” можно достичь скорости до 921 600 бод на расстоянии до 1 км.
Методы отправки данных через COM-порт "от Arduino к ПК"

Основные функции отправки

Serial.print( <данные> ) - отправляет данные без перевода строки

Serial.println( <данные> ) - отправляет данные с переводом строки

Serial.write( <данные> ) - отправляет двоичные данные

Отправка чисел:


Целые числа (int, byte)

  • При отправке чисел кавычки не используются
  • Можно выбрать систему счисления (десятичную, двоичную, восьмеричную, шестнадцатеричную) для отображения
void setup() {
  Serial.begin(9600);
}

void loop() {
  int number = 123;
  
  // Базовый вывод числа
  Serial.print(number);    // выведет "123"
  
  // Вывод в разных системах счисления
  Serial.print(number, DEC);  // десятичная система
  Serial.print(number, HEX);  // шестнадцатеричная
  Serial.print(number, OCT);  // восьмеричная
  Serial.print(number, BIN);  // двоичная
  
  delay(1000);
}
Вещественные числа (float, double)

  • При отправке чисел кавычки не используются
  • Можно выбрать количество значащих цифр после запятой
void setup() {
  Serial.begin(9600);
}

void loop() {
  float pi = 3.14159265;
  
  // Базовый вывод
  Serial.print(pi);        // выведет "3.14"
  
  // Указание количества знаков после запятой
  Serial.print(pi, 2);     // выведет "3.14"
  Serial.print(pi, 4);     // выведет "3.1416"
  
  delay(1000);
}

символы (char)

  • При отправке символов используются одинарные кавычки Serial.print('G')
Основные принципы
  • ASCII-кодировка: все символы передаются в соответствии с таблицей ASCII
  • Побайтовая передача: каждый символ передается как отдельный байт
Serial.print('A');  // Отправка символа A
Serial.print('1');  // Отправка символа 1
Serial.print('*');  // Отправка символа *

  • При использовании одиночных кавычек символ отправляется как отдельный ASCII-символ
  • Если отправить число в одиночных кавычках, оно будет интерпретировано как ASCII-символ
Serial.print('65');  // Выведет букву A (ASCII код 65)
Serial.print(65);    // Выведет число 65

строки (string)

  • При отправке символов используются двойные кавычки Serial.print("APEROLb")
Основные принципы
  • Двойные кавычки используются для отправки строк (последовательности символов):
  • При использовании двойных кавычек отправляется целая строка
Serial.print("Hello");  // Отправка строки Hello
Serial.print("123");    // Отправка строки 123
Пример и символы и строки
void setup() {
  Serial.begin(9600);
}

void loop() {
  // Отправка отдельных символов
  Serial.print('H');
  Serial.print('e');
  Serial.print('l');
  Serial.print('l');
  Serial.print('o');
  
  // Отправка строки
  Serial.print(" World");
  
  delay(1000);
}
Массивы

  • Правила будут зависет от наполнения массива
void setup() {
  Serial.begin(9600);
}

void loop() {
  // Массив символов
  char letters[] = {'A', 'B', 'C'};
  Serial.print(letters);
  
  // Массив чисел
  int numbers[] = {1, 2, 3, 4, 5};
  for(int i = 0; i < 5; i++) {
    Serial.print(numbers[i]);
    Serial.print(" ");
  }
  
  // Массив строк
  String names[] = {"Анна", "Борис", "Виктор"};
  for(String name : names) {
    Serial.println(name);
  }
  
  delay(1000);
}
  • Serial.write() — функция для отправки бинарных данных через последовательный порт. Отправляет данные в виде байтов или последовательности байтов.
  • Используется для связи микроконтроллеров например: для оптимизации (уменьшения объемов) передаваемых данных
Serial.write(val);           // отправка одного байта
Serial.write(str);          // отправка строки
Serial.write(buf, len);     // отправка массива байтов
Возвращаемое значение
Функция возвращает количество отправленных байтов (тип size_t).

  • Примеры использования
для int

void setup() {
  Serial.begin(9600);
  int number = 45;
  Serial.write(number);    // отправит байт со значением 45
}

для byte

void setup() {
  Serial.begin(9600);
  byte b = 65;             // ASCII код буквы A
  Serial.write(b);         // выведет букву A
}

для char

void setup() {
  Serial.begin(9600);
  char c = 'A';
  Serial.write(c);         // отправит байт 65
}

для sting

void setup() {
  Serial.begin(9600);
  String str = "Hello";
  Serial.write(str);       // отправит строку как последовательность байтов
}

для массива

void setup() {
  Serial.begin(9600);
  byte buffer[] = {72, 101, 108, 108, 111};
  Serial.write(buffer, 5); // отправит массив из 5 байтов
}

Конкатенация (от лат. concatenatio — «присоединение цепями, сцепление») — это операция соединения или склеивания объектов линейной структуры, чаще всего строк.
Основные характеристики
  • Является бинарной операцией
  • Применяется к последовательностям элементов
  • Результат — новый объект, содержащий элементы исходных объектов
Примеры использования
  • Конкатенация слов «микро» и «мир» даёт слово «микромир»
  • Объединение строк «Hello» и «World» даёт «HelloWorld»
Свойства конкатенации
  • Ассоциативность: результат не зависит от расстановки скобок при последовательном объединении
  • Некоммутативность: порядок соединения важен (A+B ≠ B+A)

Конкатенация различных типов данных в ArduinoОсновные правила конкатенации
  1. При конкатенации с String объектом можно объединять любые типы данных
  2. Для char и int требуется преобразование в строку
  3. Конкатенация возможна через оператор +
Базовые примеры конкатенации

void setup() {
  Serial.begin(9600);
  
  // Пример 1: простая конкатенация строк
  String str1 = "Привет";
  String str2 = "мир";
  String result = str1 + " " + str2;
  Serial.println(result); // Выведет: "Привет мир"
  
  // Пример 2: конкатенация с числом
  int number = 2025;
  String yearStr = "Год: " + String(number);
  Serial.println(yearStr); // Выведет: "Год: 2025"
}

void loop() {
  // Пример 3: динамическая конкатенация
  int sensorValue = analogRead(A0);
  String sensorData = "Значение датчика: " + String(sensorValue);
  Serial.println(sensorData);
  
  delay(1000);
}




Примеры с разными типами данных
void setup() {
  Serial.begin(9600);
  
  // Конкатенация char и String
  char letter = 'A';
  String message = "Буква: " + String(letter);
  Serial.println(message); // Выведет: "Буква: A"
  
  // Конкатенация нескольких типов
  float temp = 23.5;
  String tempStr = "Температура: " + String(temp) + "°C";
  Serial.println(tempStr); // Выведет: "Температура: 23.5°C"
}




Сложная конкатенация
void setup() {
  Serial.begin(9600);
  
  // Пример с массивом
  char name[] = "Arduino";
  int id = 123;
  String deviceInfo = String(name) + " ID: " + String(id);
  Serial.println(deviceInfo); // Выведет: "Arduino ID: 123"
  
  // Пример с форматированием
  int hour = 14;
  int minute = 30;
  String time = String(hour) + ":" + String(minute);
  Serial.println("Текущее время: " + time); // Выведет: "Текущее время: 14:30"
}

  1. Оптимизация вывода
Важные моменты при выводе
  • Эффективность: использование нескольких Serial.print() может быть эффективнее создания больших String объектов
  • Буферизация: учитывайте размер буфера при работе с длинными строками
  • Форматирование: добавляйте пробелы и разделители для читаемости
  • Типы данных: правильно преобразуйте типы при конкатенации
Практические рекомендации
  • Для частого вывода используйте последовательные Serial.print()
  • При работе с большими строками используйте String() с осторожностью (помни о буфере в 64 байта!)
  • Добавляйте разделители для улучшения читаемости вывода
  • Проверяйте типы данных перед конкатенацией
Неоптимизированный вывод (лишние объекты String:)

void loop() {
  int value1 = 42;
  int value2 = 24;
  
  // Создание промежуточных String объектов
  String value1Str = String(value1);
  String value2Str = String(value2);
  String comma = ", ";
  String result = "Значения: " + value1Str + comma + value2Str;
  
  // Вывод через один Serial.println
  Serial.println(result);
  
  delay(1000);
}


Оптимизированный вывод

void loop() {
  // Оптимизированный вывод без создания лишних объектов
  int value1 = 42;
  int value2 = 24;
  
  Serial.print("Значения: ");
  Serial.print(value1);
  Serial.print(", ");
  Serial.print(value2);
  
  delay(1000);
}


Оптимизированный вывод с "ассоциацией" расположения строк в порте вывода

Оптимизированный вывод

void loop() {
  // Оптимизированный вывод без создания лишних объектов
  int value1 = 42;
  int value2 = 24;
  
  Serial.print("Значения: "); Serial.print(value1); Serial.print(", "); Serial.print(value2);
  
  delay(1000);
}

ЗАДАНИЕ

Научиться выполнять арифметические вычисления с различными типами данных в Arduino и формировать информативный вывод результатов.
Задача
Написать программу для Arduino, которая выполняет следующие действия:

Реализовать вычисление двух арифметических выражений:
  • Первое выражение содержит только целые числа (тип int)
  • Второе выражение содержит целые и вещественные числа (типы int и float)
Сформировать подробный вывод в Serial порт, включающий:
  • Само выражение в текстовом виде
  • Значения используемых переменных
  • Результат вычислений
Вариант Пример 1 (целые числа) Пример 2 (целые и вещественные)
1 Переменные:
a = 12, b = 5, c = 3
Выражение:
a * b - c / 2
Переменные:
x = 4.5, y = 6, z = 2.75
Выражение:
x + y * z - x / 2
2 Переменные:
m = 20, n = 8, k = 4
Выражение:
m / n + k * 3
Переменные:
p = 7.2, q = 5, r = 1.5
Выражение:
p * q - r / 2 + p
3 Переменные:
x1 = 15, y1 = 9, z1 = 6
Выражение:
x1 - y1 / z1
Переменные:
a1 = 3.14, b1 = 4, c1 = 2.5
Выражение:
a1 * b1 + c1 / 2
4 Переменные:
s = 30, t = 10, u = 5
Выражение:
s / t * u
Переменные:
v = 6.25, w = 8, x = 1.2
Выражение:
v + w * x - v / 2
5 Переменные:
p1 = 25, q1 = 5, r1 = 2
Выражение:
p1 / q1 + r1 * 3
Переменные:
s1 = 5.5, t1 = 7, u1 = 3.25
Выражение:
s1 * t1 - u1 / 2
6 Переменные:
a2 = 18, b2 = 6, c2 = 4
Выражение:
a2 / b2 * c2
Переменные:
d = 4.8, e = 9, f = 2.1
Выражение:
d + e * f - d / 2
7 Переменные:
x3 = 24, y3 = 8, z3 = 3
Выражение:
x3 / y3 + z3 * 2
Переменные:
a3 = 6.7, b3 = 5, c3 = 1.5
Выражение:
a3 * b3 - c3 / 2
8 Переменные:
w1 = 16, x1 = 4, y1 = 7
Выражение:
w1 / x1 + y1
Переменные:
z1 = 8.4, a1 = 3, b1 = 2.2
Выражение:
z1 * a1 - b1 / 2
9 Переменные:
a4 = 14, b4 = 7, c4 = 2
Выражение:
a4 * b4 / c4
Переменные:
x4 = 5.6, y4 = 4, z4 = 1.8
Выражение:
x4 + y4 * z4
10 Переменные:
m2 = 22, n2 = 11, k2 = 3
Выражение:
m2 / n2 * k2
Переменные:
p2 = 9.1, q2 = 6, r2 = 2.4
Выражение:
p2 - q2 * r2 / 2
Вывод результата кода
Made on
Tilda