Как работает кадр UART и что считает калькулятор
UART (асинхронный последовательный порт) передаёт данные без отдельной линии тактирования: приёмник и передатчик заранее договариваются о скорости, а синхронизация восстанавливается по каждому кадру. Скорость задаётся в бодах — это число символов линии в секунду, и для двухуровневого сигнала «бод» численно равен «биту в секунду», но считая вместе со служебными битами. Именно поэтому пропускная способность по полезным данным всегда ниже цифры на этикетке порта: часть времени линия занята стартом и стопом. Калькулятор берёт скорость, число бит данных, наличие чётности и количество стоп-битов, собирает из них длину кадра и переводит её во время передачи одного байта, в реальную пропускную способность (байт/с) и в эффективность кадра.
Бит/кадр = 1 (старт) + данные + чётность (0/1) + стоп (1/1,5/2)
Время байта = бит/кадр / baud байт/с = baud / бит/кадр
Эффективность = данные / бит-в-кадре · 100 %
Формула прямая: длина кадра — это сумма одного старт-бита, выбранного числа бит данных (обычно 8, реже 5–9), нуля или одного бита чётности и одного, полутора или двух стоп-битов. Разделив длину кадра на скорость, получаем время «на проводе» для одного байта; поделив скорость на длину кадра — сколько байт в секунду реально уходит в линию. Эффективность показывает, какая доля времени тратится именно на данные, а не на обрамление кадра.
Из чего состоит кадр и зачем каждый бит
Кадр всегда начинается со старт-бита — перепада линии из состояния покоя (лог. 1) в 0. Этот фронт запускает внутренний счётчик приёмника, который затем сэмплирует середину каждого следующего бита. Далее идут биты данных, младшим вперёд (LSB first). Необязательный бит чётности добавляет простейший контроль ошибок: он дополняет число единиц до чётного или нечётного, что ловит любое одиночное искажение. Завершают кадр стоп-биты (лог. 1) — они гарантируют паузу перед следующим стартом и дают приёмнику время обработать байт. Полтора и два стоп-бита исторически нужны были медленным устройствам и до сих пор встречаются в промышленных протоколах. Запись «8N1» читается как 8 бит данных, No parity (нет чётности), 1 стоп — самый распространённый формат, дающий кадр ровно в 10 бит.
Обе стороны обязаны использовать одинаковый формат и одинаковую скорость: асинхронная схема не передаёт тактовую частоту, поэтому расхождение бодрейта накапливается по кадру и на последних битах сэмпл может «съехать» в соседний. Допустимое рассогласование — порядка ±2…3 % на 10-битном кадре; сколько именно ошибки даёт ваш делитель, удобно прикинуть в калькуляторе ошибки бодрейта. Сам делитель скорости в микроконтроллере задаётся через тактовый модуль — его считает таймер/прескейлер МК.
Время передачи, пропускная способность и эффективность
Время одного бита равно 1/baud, а время байта — это длина кадра, умноженная на время бита. При 8N1 накладные расходы составляют 2 бита из 10, то есть эффективность 80 %: пятая часть канала уходит на обрамление. Добавление чётности или второго стоп-бита удлиняет кадр до 11–12 бит и роняет эффективность до 73–67 %, зато повышает надёжность. Пропускная способность в байтах в секунду — это просто скорость, делённая на длину кадра, и она напрямую задаёт, уложится ли поток в требуемый темп: например, лог с датчика на 10 строк по 64 байта в секунду требует минимум 640 байт/с полезных, то есть 6400 бод с запасом. Для непрерывных потоков (аудио, телеметрия) удобно сверять требуемую цифру с калькулятором битрейта потока.
Полезно помнить и про приём: аппаратный UART внутри сэмплирует каждый бит с частотой в 8 или 16 раз выше бодрейта, чтобы точно попасть в его середину и отфильтровать дребезг фронта. От этого зависит, какой запас по рассогласованию частот у вас есть на практике. А время байта задаёт крайний срок обслуживания прерывания: если обработчик приёма не успеет забрать байт из регистра за один интервал кадра, следующий байт затрёт предыдущий — возникнет overrun. Поэтому на высоких скоростях (230400 бод и выше) почти всегда включают аппаратный FIFO или приём по DMA, а расчётное время байта из таблицы служит нижней границей бюджета времени на один принятый символ.
Стандартные скорости и время байта (8N1, 10 бит)
В таблице — привычный ряд скоростей UART, время передачи одного байта в формате 8N1 и полезная пропускная способность. Значения посчитаны по тем же формулам, что и виджет выше.
| Скорость, бод | Время байта | Пропускная, байт/с |
| 9600 | 1,04 мс | 960 |
| 19200 | 520,8 мкс | 1920 |
| 38400 | 260,4 мкс | 3840 |
| 57600 | 173,6 мкс | 5760 |
| 115200 | 86,8 мкс | 11520 |
| 230400 | 43,4 мкс | 23040 |
| 921600 | 10,9 мкс | 92160 |
Где применяют — и где не годится
Расчёт кадра нужен всюду, где по последовательному порту гонят данные с жёстким темпом: отладочные логи микроконтроллеров, GPS-модули (NMEA на 9600), модемы и радиомодули, обмен с дисплеями и датчиками. Зная время байта, легко оценить, успеет ли обработчик прерывания разгрести приём, и не переполнится ли буфер FIFO при заданной скорости. Для дальней и помехозащищённой связи тот же кадр UART кладут на дифференциальную физику линии RS-485 — логика бит остаётся прежней, меняется только уровень сигнала. А вот для синхронных шин формула не применима: шина I2C и SPI тактируются отдельной линией, а у битового тайминга CAN кадр устроен принципиально иначе (арбитраж, стаффинг-биты, CRC), поэтому их длину и скорость считают своими калькуляторами. Также учтите: реальная пропускная способность на прикладном уровне ещё ниже расчётной — её съедают паузы между байтами, переключение направления в полудуплексе и служебные поля протокола поверх UART.
Пример
Значения по умолчанию: 115200 бод, 8 бит данных, чётности нет, 1 стоп-бит (формат 8N1). Длина кадра = 1 + 8 + 0 + 1 = 10 бит. Время байта = 10 / 115200 ≈ 86,81 мкс. Пропускная способность = 115200 / 10 = 11520 байт/с. Эффективность = 8 / 10 · 100 = 80 %. Если в поле «Передать N байт» вписать 256, калькулятор покажет время блока = 256 · 10 / 115200 ≈ 22,22 мс. Добавьте бит чётности — кадр станет 11 бит, время байта вырастет до ≈ 95,5 мкс, а эффективность упадёт до ≈ 72,7 %.
См. также: ошибка бодрейта · таймер/прескейлер МК · битрейт потока · линия RS-485 · шина I2C · тайминг CAN · все калькуляторы
|