Связь · разбор
UART и Serial в Arduino: RX, TX и связь двух плат
Два провода, по которым плата разговаривает с компьютером, модулем или другой платой. Разбираем, что бежит по проводу, почему TX всегда идёт к RX, откуда берутся кракозябры и сколько памяти стоит второй порт. Расход памяти измерен сборкой под Arduino Uno, остальные числа — из даташита контроллера и исходников ядра.
Если вы искали окно монитора порта — как его открыть, поменять скорость, посмотреть график и сохранить лог, — это на странице Монитор порта и график значений. Здесь речь о железе: что при этом происходит на выводах платы.
Что такое UART и что бежит по проводу
UART — это способ передать байт по одному проводу, разложив его на биты во времени. Никакого провода с тактовым сигналом рядом нет: обе стороны заранее договариваются о скорости и дальше просто отсчитывают одинаковые промежутки. Отсюда и все свойства этой связи — и простота, и её главная болезнь.
В покое линия держит высокий уровень. Передатчик опускает её на один промежуток — это стартовый бит, по нему приёмник понимает, что начался байт. Дальше едут восемь бит данных, младшим вперёд, и завершает всё стоповый бит: линия снова поднимается. Итого десять бит на каждый байт, и это готовая арифметика: на 9 600 бод плата передаёт 960 байт в секунду, на 115 200 — 11 520.
Строчка Serial.begin(9600) задаёт как раз длину одного промежутка. У неё есть и второй, редко используемый параметр — формат кадра: Serial.begin(9600, SERIAL_8E1) добавит бит чётности. Это важно знать вот почему: если два устройства договорились о скорости, но не о формате, текст будет так же испорчен, как при неверной скорости. У промышленных приборов формат с чётностью встречается часто, и его придётся повторить у себя.
RX и TX: где они на вашей плате
Выводов всегда два: TX — «говорю», RX — «слушаю». На классических платах это выводы 0 и 1, и они же заняты разговором с компьютером через USB. Сколько таких пар у платы — зависит от микроконтроллера, а не от программы.
| Плата | Портов | Выводы | Что стоит знать |
|---|---|---|---|
| Uno, Nano, Pro Mini | 1 | RX — 0, TX — 1 | Тот же порт занят связью с компьютером |
| Mega 2560 | 4 | 0/1, затем TX 18 · RX 19, TX 16 · RX 17, TX 14 · RX 15 | У Serial1, Serial2 и Serial3 меньший номер — это TX, а не RX |
| Leonardo, Pro Micro | 1 железный + USB | RX — 0, TX — 1 (это Serial1) | Serial у них — это USB, а не выводы платы |
| ESP32 | 3 | UART2 — RX 16, TX 17 | Выводы можно переназначить в скетче |
Две строки этой таблицы стоят отдельного пояснения, потому что на них спотыкаются чаще всего.
Mega. У основного порта меньший номер вывода — это RX (0), а у трёх дополнительных наоборот: 18 — это TX, а 19 — RX. Не «по аналогии», а буквально так записано в файле описания платы. Перепутанная пара выглядит как полностью мёртвая связь.
Leonardo и Pro Micro. Слово Serial у них означает не выводы, а USB. Поэтому скорость в скобках у них ни на что не влияет, а данные, отправленные до того, как открыли монитор, просто теряются. Настоящий вывод платы зовётся Serial1. Подробности — на странице Arduino Leonardo и Pro Micro.
Проверить это можно, ничего не подключая: соберите скетч с Serial1 для Uno. Компилятор ответит 'Serial1' was not declared in this scope — второго порта у платы нет, и никакая библиотека тут не поможет. Это одна из ошибок, которые регулярно приходят к нам в отчётах: чаще всего её приносит штатный пример SerialPassthrough, написанный для плат с двумя портами.
Связь двух плат: три провода
Это самая частая практическая задача и самая частая ошибка в ней. Провода перекрещиваются: тот, кто говорит, соединяется с тем, кто слушает.
- 1 (TX) → 0 (RX) (первая плата говорит)
- 0 (RX) → 1 (TX) (вторая плата отвечает)
- GND → GND (общий ноль)
Почему TX к TX не работает. Это два передатчика, соединённые вместе: оба выдают напряжение, слушать некому. В мониторе будет тишина, а при одновременной передаче с обеих сторон выходы будут ещё и бороться друг с другом — один тянет линию вверх, другой вниз.
Почему земля обязательна. Сигнал — это не «напряжение само по себе», а разница между сигнальным проводом и нулём. Пока у плат нет общего нуля, приёмник просто не знает, относительно чего мерить: связь будет то работать, то нет, чаще всего именно на длинных проводах и при отдельном питании плат. Питание между платами, наоборот, соединять не нужно — у каждой своё.
Пошаговую сборку двух плат с видео и списком деталей мы держим в уроке «Соединяем две Arduino по шине UART». Здесь — теория и диагностика: почему получается и почему не получается.
Скорость: 9 600, 115 200 и откуда берутся кракозябры
Скорость измеряется в бодах — это число промежутков в секунду. Правило одно: у обеих сторон она должна совпадать. Но за этим простым правилом прячется вещь, о которой редко пишут: плата не всегда может выдать ту скорость, которую вы заказали.
Внутри контроллера скорость получается делением тактовой частоты на целое число. Если частота на нужную скорость нацело не делится, получается ближайшее возможное значение — и появляется погрешность. Мы посчитали её по тому же коду, который выполняется в вашей плате, и сверили с даташитом контроллера.
Практический вывод простой. Для связи с компьютером берите 9 600, 19 200 или 38 400 — у них погрешность 0,16 %, запас огромный. Если нужно быстро и на обоих концах Arduino — ставьте 250000: эту скорость плата выдаёт абсолютно точно, в отличие от привычной 115 200. А 230 400 на 16 МГц лучше не трогать вовсе, и уж тем более на 8-мегагерцевой плате: там запрос 230 400 молча превратится в 250 000.
Кракозябры бывают двух разных видов
Их всё время путают, а лечатся они по-разному.
- Испорчено всё, включая латиницу и цифры — не совпала скорость или формат кадра. В Trema IDE есть кнопка «Подобрать скорость»: программа сама перебирает варианты и находит тот, на котором текст становится осмысленным. Подробно — в статьях Кракозябры в мониторе порта и Подбор скорости.
- Латиница и цифры целы, испорчены только русские буквы — скорость верная, дело в кодировке: текст отправлен в одной, а прочитан в другой. Кнопка подбора скорости тут не поможет; нужно, чтобы принимающая программа читала UTF-8.
Аппаратный порт или программный
У Uno одна пара выводов, а модулей может быть несколько. Выход — библиотека SoftwareSerial: она делает «порт» из любой пары обычных выводов, отсчитывая промежутки программно. Её не нужно нигде скачивать, она приходит вместе с поддержкой платы:
#include <SoftwareSerial.h>
SoftwareSerial link(2, 3); // 2 - приём (RX), 3 - передача (TX)
void setup() {
link.begin(9600);
}
void loop() {
}
Плата за это выглядит так (все числа — наши сборки одного и того же скетча-эха под Arduino Uno):
| Что сравниваем | Аппаратный Serial | SoftwareSerial |
|---|---|---|
| Сколько портов | Столько, сколько сделал производитель платы | Сколько угодно, но слушать можно только один |
| Занимает флеш-памяти | 1 026 байт | 1 760 байт |
| Занимает ОЗУ | 175 байт | 117 байт |
| Очередь на приём | 64 байта, заполняется прерыванием | 64 байта, общие на все программные порты |
| Очередь на передачу | 64 байта, программа не ждёт | Нет: программа стоит, пока байт не уйдёт |
| Мешает ли остальному коду | Почти нет | На время байта выключает все прерывания |
| До какой скорости рассчитан | До 2 Мбит/с по даташиту | До 115 200 на 16 МГц и до 57 600 на 8 МГц |
Неожиданный результат в строке про ОЗУ: программный порт занимает памяти меньше аппаратного — 117 байт против 175. Причина в том, что у него нет очереди на передачу: он не складывает байты, а отправляет их сразу, занимая процессор. Зато кода ему нужно почти вдвое больше.
Четыре ограничения, о которых узнают поздно
- Слушать можно только один программный порт. Внутри библиотеки один указатель на «активный» объект на весь класс. Команда
begin()сама делает порт активным, поэтому после двух вызовов подряд слушать будет только второй, а первый молча перестанет принимать. Переключение командойlisten()вдобавок стирает всё, что успело накопиться. - На время передачи байта выключаются все прерывания. На 9 600 бод это 0,94 мс полной глухоты на каждый байт: в это время не принимаются данные на других портах, а часы
millis()замирают и потом догоняют. На приёме обработчик занимает процессор дольше целого байта — там миллисекунды теряются по-настоящему. - Приём работает не на всех выводах. На Uno и Nano — на любых, а на Mega только на выводах 10–13, 50–53 и A8–A15, то есть на 16 из 70. Хуже всего то, что
begin()об этом не сообщает: порт просто останется передающим, а приём будет молчать. - Есть потолок скорости. В самой библиотеке написано: приём рассчитан до 115 200 на 16 МГц и до 57 600 на 8 МГц. Причина арифметическая — на 115 200 один бит длится около 139 тактов, а вход в обработчик прерывания съедает больше половины этого времени.
Отсюда простое правило: аппаратный порт — всегда, когда он свободен. Если модулей больше одного, стоит смотреть в сторону платы с несколькими портами: Mega, где их четыре, или ESP32, где выводы портов ещё и переназначаются.
Выводы 0 и 1 воюют с прошивкой
Через эти же два вывода в плату заливается программа. Пока на них висит модуль, загрузчик и компьютер перебивают друг друга, и прошивка срывается — обычно на строке про «программатор не отвечает».
Насколько это частая беда, видно по нашим же отчётам об ошибках: сбой диалога с загрузчиком приходит почти с трети компьютеров, приславших отчёты за два месяца, — это самая частая беда при загрузке (при сборке первое место держит ненайденная библиотека). Занятые выводы 0 и 1 — одна из её причин, наряду с неверным портом и кабелем без данных.
Что с этим делать, по убыванию удобства:
- перенести модуль на программный порт (любые другие два вывода) — тогда конфликт исчезает навсегда;
- взять плату, где для модуля есть отдельный порт: на Mega их четыре, у Leonardo выводы 0 и 1 — это
Serial1, не занятый прошивкой; - снимать два провода на время загрузки — работает, но об этом забывают ровно до первой сорванной прошивки.
Разбор всех причин срыва загрузки — на странице Ошибка загрузки скетча. Там же — что означают строки avrdude в консоли.
Пять вольт и три и три: когда нужен делитель
Классические Arduino работают от 5 В, а платы ESP и наши модули связи с логикой 3,3 В требуют согласования. Соединять их напрямую опасно, но не в обе стороны, и это важное уточнение.
- Из 5 В в 3,3 В — нельзя. Выводы трёхвольтовых плат рассчитаны на напряжение чуть выше собственного питания: у ESP32, например, предел по даташиту 3,6 вольта. Пять вольт этот предел превышают, и вывод может выйти из строя.
- Из 3,3 В в 5 В — обычно работает. Пятивольтовый контроллер считает единицей всё выше 0,6 от питания, то есть выше 3,0 В. Сигнал 3,3 В в этот порог проходит, но запас — считаные десятые доли вольта, и на длинных проводах он съедается.
Практический вывод: согласовывать нужно только одну линию — ту, что идёт из передатчика пятивольтовой платы в приёмник трёхвольтовой. Самое простое — делитель из двух резисторов: 1 кОм в разрыв провода и 2 кОм с этой точки на землю дают ровно 3,33 В. Готовый модуль-переходник избавляет от паяльника и годится сразу для обеих линий.
Питание и логические уровни переходника USB-UART — разные вещи. У нашего Piranha USB-UART в карточке указано: питание переключается между 3,3 и 5 В, а логические уровни — 3,3 В. Переключатель питания и уровни сигнала — разные вещи; прежде чем соединять, стоит заглянуть в характеристики.
USB-TTL: прошить плату без разъёма и подслушать чужую
USB-TTL (он же USB-UART) — маленький переходник, который делает из USB-порта компьютера обычную пару RX/TX. Нужен он в двух случаях.
Прошить плату, у которой нет USB-разъёма — например, Pro Mini. Полная схема подключения с распиновкой разобрана на странице Arduino Pro Mini.
Посмотреть, что устройство говорит на самом деле. Приём переходника подключают к передающей линии устройства, землю — к земле, а передачу переходника не подключают вовсе. Получается «шпион»: в мониторе видно поток, не вмешиваясь в него. Это самый дешёвый способ понять, кто из двух собеседников молчит — особенно когда своих плат две, а компьютер один.
Как передавать числа, а не буквы
Пока речь о «привет» из монитора, всё просто. Как только две платы начинают обмениваться показаниями, всплывает неприятное свойство UART: это поток байтов без границ. Приёмник не знает, где кончилась одна посылка и началась следующая, а любая помеха на проводе — это лишний или потерянный байт, после которого всё едет.
Поэтому в передаче должны быть две вещи: метка начала и контрольная сумма. На схеме выше связь показана на аппаратном порту — выводах 0 и 1. В скетчах ниже она поднята на программном порту, выводы 3 и 2: так провода не мешают заливать скетч, а монитор остаётся свободным для отладки. Соединяются они по тому же правилу: вывод 3 передатчика идёт на вывод 2 приёмника, земли соединены. Вот передатчик — он шлёт номер датчика и значение:
// Передатчик. Отправляет по проводам номер датчика и его значение.
// Провода: вывод 3 передатчика -> вывод 2 приёмника, и обязательно GND -> GND.
// К выводу A0 подключите потенциометр или датчик.
#include <SoftwareSerial.h>
SoftwareSerial link(2, 3); // 2 - приём (RX), 3 - передача (TX)
const byte START = 0xAA; // метка начала пакета
const byte ESC = 0xAB; // служебный байт: следующий за ним - это данные
void setup() {
link.begin(9600);
}
void put(byte b) { // метку и сам ESC внутри данных экранируем
if (b == START || b == ESC) {
link.write(ESC);
link.write((byte)(b ^ 0x20));
} else {
link.write(b);
}
}
void send(byte id, int value) {
byte lo = value & 0xFF;
byte hi = (value >> 8) & 0xFF;
byte sum = id ^ lo ^ hi; // контрольная сумма: сложение по модулю два
link.write(START); // метка идёт без экранирования - она одна такая
put(id);
put(lo);
put(hi);
put(sum);
}
void loop() {
send(1, analogRead(A0));
delay(200);
}
А вот приёмник. Он не читает «по одному байту в цикле», а собирает пакет и проверяет сумму; если она не сошлась, пакет выбрасывается, и приём начинается заново с ближайшей метки:
// Приёмник. Собирает пакет из потока байтов и проверяет контрольную сумму.
// Провода: вывод 3 передатчика -> вывод 2 приёмника, и обязательно GND -> GND.
#include <SoftwareSerial.h>
SoftwareSerial link(2, 3); // 2 - приём (RX), 3 - передача (TX)
const byte START = 0xAA;
const byte ESC = 0xAB;
byte packet[4];
byte filled = 0;
bool started = false;
bool escaped = false;
void setup() {
Serial.begin(9600);
link.begin(9600);
}
void loop() {
while (link.available()) {
byte b = link.read();
if (b == START) { // метка всегда начинает пакет заново
started = true;
filled = 0;
escaped = false;
continue;
}
if (!started) continue; // мусор до первой метки пропускаем
if (b == ESC) { // следующий байт - экранированные данные
escaped = true;
continue;
}
if (escaped) {
b ^= 0x20;
escaped = false;
}
packet[filled++] = b;
if (filled < 4) continue; // пакет ещё не полон
started = false;
byte id = packet[0];
int value = (int)((uint16_t)packet[1] | ((uint16_t)packet[2] << 8));
byte sum = packet[0] ^ packet[1] ^ packet[2];
if (sum != packet[3]) { // сумма не сошлась - пакет битый
Serial.println(F("Помеха: пакет отброшен"));
continue;
}
Serial.print(F("Датчик "));
Serial.print(id);
Serial.print(F(": "));
Serial.println(value);
}
}
Честная оговорка: одной метки и суммы мало. Байт метки может попасться внутри данных, и если хоть один байт потерялся, приёмник встанет на ложную нарезку — сумма при этом иногда сходится, и на экран пойдут числа из воздуха. Мы это проверили моделированием: при неподвижном показании приёмник может печатать одно и то же неверное число до самой перезагрузки. Поэтому метку экранируют: если байт данных совпал с меткой, передатчик ставит перед ним служебный байт. Тогда метка означает начало кадра и ничего больше, а любая помеха стоит ровно одного пакета. Для более требовательных задач добавляют ещё длину пакета и настоящую контрольную сумму CRC.
Очередь на приём: 64 байта и ни байтом больше
Принятые байты складываются в очередь, и если программа не успевает их забирать, новые выбрасываются молча — ни ошибки, ни признака. Размер очереди — 64 байта (полезных 63), и вот за какое время она заполняется:
| Скорость | Один байт | Очередь заполнится за |
|---|---|---|
| 9 600 | 1,04 мс | 66,7 мс |
| 38 400 | 0,26 мс | 16,7 мс |
| 57 600 | 0,17 мс | 11,1 мс |
| 115 200 | 0,087 мс | 5,6 мс |
| 250 000 | 0,040 мс | 2,6 мс |
Смотрите на правый столбец и сравнивайте со своим циклом. Обычный delay(100) в loop() при скорости 9 600 уже теряет данные, а на 115 200 данные начнёт терять даже delay(10): очередь заполняется за 5,6 мс. Лечится это не увеличением буфера, а отказом от задержек — счётом времени по millis(), как в уроке про кнопку без задержек.
Есть и обратная ловушка: команды вроде Serial.readStringUntil() или parseInt() ждут данные целую секунду, если их нет — таково значение по умолчанию. Секунда простоя в цикле часто выглядит как «плата стала тормозить».
Команды текстом: без класса String дешевле
Второй способ обмена — обычный текст с переводом строки в конце. Он удобен тем, что команды можно набирать руками в мониторе. Разбирать такую строку лучше в обычном массиве символов:
// Разбор команды из монитора порта без класса String:
// строка собирается в обычный массив символов, память не дробится.
char buffer[16];
byte length = 0;
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop() {
while (Serial.available()) {
char c = Serial.read();
if (c == '\r') continue; // мониторы Windows шлют \r перед \n
if (c == '\n') { // команда закончилась
buffer[length] = 0;
if (strcmp(buffer, "on") == 0) digitalWrite(13, HIGH);
if (strcmp(buffer, "off") == 0) digitalWrite(13, LOW);
length = 0;
} else if (length < sizeof(buffer) - 1) {
buffer[length++] = c; // копим символы
}
}
}
Одна тонкость: монитор порта добавляет к строке не только перевод строки, но может добавлять и возврат каретки — в Trema IDE это выпадающий список «Конец строки». Строка if (c == 0x0D) continue; в скетче делает разбор нечувствительным к выбору: без неё команда «on» превратится в «on» с невидимым символом на конце и не совпадёт ни с чем.
Тот же разбор через класс String — то же самое поведение, только вместо массива символов строка — занимает на 1 620 байт больше флеш-памяти: 3 474 байта против 1 854. Это 5 % всей памяти Uno за одну строчку удобства. И это ещё не всё: String занимает память по ходу работы, и в долго живущем устройстве она со временем дробится на куски. Для разбора коротких команд массив символов надёжнее.
Что растёт из UART дальше
Многое из того, что кажется отдельными технологиями, — это тот же самый UART, просто линия между двумя устройствами устроена иначе.
- Bluetooth. Модуль HC-05 — это UART без проводов: плата шлёт байты в его RX, они выходят на телефоне. В карточке нашего Trema-модуля HC-05 указано: скорость по умолчанию 38 400, питание 3,3–5 В, и отдельно предупреждение — напряжение на выводах RX и TX не должно превышать напряжение питания модуля.
- RS-485. Те же байты, но по витой паре и на сотни метров: сигнал передаётся разницей напряжений между двумя проводами, поэтому наводки, приходящие на оба провода сразу, взаимно уничтожаются. Со стороны платы это по-прежнему RX и TX, плюс вывод переключения «говорю/слушаю» — линия полудуплексная, по ней в один момент времени говорит только один. На этом же стоит промышленный протокол Modbus RTU.
- RS-232 — это не то же самое, что UART. У классического компьютерного COM-разъёма уровни другие: перевёрнутые и до ±12 В. Подключать его прямо к выводам 0 и 1 нельзя — предельно допустимое напряжение на выводе контроллера всего на полвольта выше питания. Нужен конвертер.
- А вот «COM-порт» в компьютере — это уже не UART. На плате стоит микросхема-мост, которая превращает USB в обычные RX/TX. Отсюда и драйверы CH340/CP2102: они нужны компьютеру, чтобы увидеть этот мост. Разбор — на странице Драйверы CH340 и CP2102.
Готовые уроки со схемами, видео и списком деталей: две платы по UART и две платы по RS-485.
Что купить для связи
Цены, артикулы и наличие — на 23.08.2026, магазин iarduino.ru. Первые три позиции нашего собственного производства.
Piranha USB-UART (FT230)
Наш переходник USB↔UART в формате micro-USB. Питание переключается между 3,3 и 5 В, логические уровни — 3,3 В. Им прошивают платы без USB-разъёма и слушают чужие устройства.
Bluetooth HC-05, Trema-модуль
UART без проводов: плата шлёт байты, телефон принимает. Питание 3,3–5 В, по умолчанию 38 400 бод, семь поддерживаемых скоростей — от 9 600 до 460 800.
Piranha Uno R3
Наша плата формата Uno: один аппаратный порт UART, мост USB-UART на CH340. Тот самый контроллер ATmega328P на 16 МГц, под который посчитаны все числа этой страницы.
| Что ещё пригодится | Зачем | Цена |
|---|---|---|
| Шлейф «папа-мама», 3 провода | Три провода, чтобы подключить модуль со штырьками — Bluetooth, USB-TTL — к гнёздам платы: RX, TX и земля | 47 ₽ |
| Преобразователь уровней 5 В ↔ 3,3 В | Четыре канала, двусторонний: хватает и на UART, и на I²C | 53 ₽ |
| Модуль RS-485 на MAX485 | Тот же UART на сотни метров по витой паре | 248 ₽ |
| Конвертер RS-232 ↔ UART, Trema-модуль | Наш модуль: подключить прибор с компьютерным COM-разъёмом | 171 ₽ |
| Arduino Mega 2560 (мост CH340) | Четыре аппаратных порта: модулям не нужен программный | 1 640 ₽ |
Эта тема в Trema IDE
- Кнопка «Подобрать скорость». Если в мониторе мусор, программа сама перебирает скорости и находит ту, на которой текст читается, — искать вручную не нужно.
- Двенадцать готовых примеров обмена в разделе «04. Обмен данными» — с русскими комментариями, включая мост между двумя портами и приём команд.
- Монитор не воюет с прошивкой за порт — среда сама освобождает его на время загрузки и возвращает после.
- Ошибки объясняются по-русски. Строку про необъявленный
Serial1или про занятый порт среда переводит на человеческий язык и подсказывает, что делать.
Вопросы и ответы
Коротко о главном
Если чего-то не хватает — напишите нам через форму поддержки, мы дополняем страницы по реальным вопросам.
Как соединить две платы Arduino между собой?
Тремя проводами: передача первой платы идёт к приёму второй, приём первой — к передаче второй, и обязательно соединяются земли. Питание между платами не соединяют. Скорость в обеих программах должна совпадать, а в самой посылке нужны метка начала и контрольная сумма — иначе приёмник не поймёт, где кончился один пакет и начался следующий.
Почему не работает, если соединить TX с TX?
Потому что это два передатчика: оба говорят и никто не слушает, в мониторе будет тишина. Провода UART всегда перекрещиваются — выход одного устройства идёт на вход другого. На платах вроде Uno и Nano это выводы 1 и 0 соответственно.
Почему в мониторе порта кракозябры?
Причин две, и лечатся они по-разному. Если испорчено всё, включая латиницу и цифры, — не совпала скорость: в Trema IDE есть кнопка «Подобрать скорость», которая находит нужную сама. Если латиница и цифры целы, а сломаны только русские буквы, — скорость верная, дело в кодировке текста.
Какую скорость выбрать: 9600 или 115200?
Для связи с компьютером берите 9600, 19200 или 38400 — плата выдаёт их с погрешностью 0,16 процента. Скорость 115200 на 16 мегагерцах точно не получается: реально плата выдаёт 117 647 бод, ошибка 2,12 процента. Если нужна скорость и на обоих концах Arduino, ставьте 250000 — это значение выдаётся абсолютно точно.
Где скачать библиотеку SoftwareSerial?
Нигде: на AVR-платах она приходит вместе с поддержкой платы, достаточно строки include в начале скетча. У других семейств бывает по-разному: у ESP8266 своя версия лежит внутри ядра, но устроена иначе и заметно расходует быструю память, а у части плат её нет вовсе. Если сообщение о ненайденном файле пришло не с AVR-платы, проще взять свободный аппаратный порт — у таких плат он обычно есть.
Почему скетч не загружается, если к выводам 0 и 1 что-то подключено?
Через эти же выводы в плату заливается программа. Пока на них висит модуль, он перебивает загрузчик, и прошивка срывается на сообщении о том, что программатор не отвечает. Выход — перенести модуль на программный порт (любые другие два вывода) или взять плату, где для модуля есть отдельный порт.
Сколько памяти занимает Serial на Arduino Uno?
Мы измерили сборкой: команда Serial.begin и простое эхо добавляют к пустому скетчу 1 026 байт флеша и 175 байт оперативной памяти — это две очереди по 64 байта и сам объект. Программный порт SoftwareSerial занимает 1 760 байт флеша, но только 117 байт ОЗУ: у него нет очереди на передачу.
Что такое USB-TTL и зачем он нужен?
Это переходник, который делает из USB-порта компьютера обычную пару выводов приёма и передачи. Нужен в двух случаях: прошить плату без USB-разъёма, например Pro Mini, и подслушать чужое устройство — для этого к его передающей линии подключают только приём переходника и общую землю.
Дальше по теме
Вторая шина, на которой держится половина модулей, — это I²C: два провода на десятки устройств. Как открыть монитор и построить график — Монитор порта. Какие вообще бывают модули и как их подключают — Модули для Arduino. Сколько памяти остаётся на всё остальное — Память Arduino.
