Скорость интерфейса в бодах или герцах — это скорость линии, а не данных. Каждый протокол тратит часть битов на синхронизацию, адресацию, контроль ошибок и паузы, и полезных данных проходит меньше. Калькулятор считает, сколько битовых интервалов занимает одно сообщение, и из этого — полезную скорость, число сообщений в секунду и долю данных в потоке.
Как считается
Для всех интерфейсов расчёт одинаковый. Сообщение из N полезных байт занимает на линии B битовых интервалов вместе со служебными полями и обязательными паузами. При скорости линии R:
Здесь tпауза — время, которое программа добавляет между сообщениями сама. Калькулятор считает поток сообщений подряд: это потолок, к которому можно приблизиться с DMA и аппаратными очередями. Все длины полей взяты из спецификаций, а сложение и деление — наш расчёт.
UART
Символ UART — старт-бит, 5–9 бит данных, бит чётности (если включён) и 1, 1,5 или 2 стоп-бита. Подробно кадр разобран в статье про UART и в калькуляторе кадра UART. Бод у UART равен биту в секунду, поэтому байт в формате 8N1 занимает 10 битовых интервалов:
| Формат | Бит на символ | Доля данных | Символов/с на 115 200 бод |
|---|---|---|---|
| 8N1 | 10 | 80 % | 11 520 |
| 8E1, 8O1, 8N2 | 11 | 72,7 % | 10 473 |
| 7E1 | 10 | 70 % | 11 520 (по 7 бит; в пересчёте на 8-битные байты — 10 080) |
| 8E2 | 12 | 66,7 % | 9600 |
Поле «Пауза между символами» учитывает промежутки, которые оставляет передатчик между байтами. Когда программа кладёт байты в регистр данных по одному из прерывания, паузы появляются почти всегда; с DMA и FIFO символы идут подряд. Пауза измеряется в битовых интервалах: при 115 200 бод один интервал — 8,68 мкс.
SPI
У SPI нет старт- и стоп-битов: байт — это 8 тактов SCK. Накладные расходы дают команда и адрес перед данными, паузы между байтами и время, когда CS неактивен. Чтение 256 байт из флеш-памяти командой 03h с трёхбайтовым адресом на 8 МГц — это 260 байт, 2080 тактов и 260 мкс: 984,6 кБ/с, 98,5 % от частоты SCK. Если между байтами по 4 такта простоя — обычное дело при передаче без DMA, — время растёт до 389,5 мкс, а доля данных падает до 65,7 %. Временную диаграмму кадра и режимы CPOL/CPHA показывает калькулятор кадра SPI.
I²C
Каждый байт на шине I²C занимает 9 тактов SCL: 8 бит и бит подтверждения ACK или NACK. К ним добавляются байт адреса, байты адреса регистра, условия START, повторный START и STOP со своими минимальными временами и пауза tBUF перед следующим START. Калькулятор берёт минимальные времена из табл. 11 UM10204, а такты считает длительностью 1/fSCL; растяжение такта ведомым не учитывается. Последовательность байтов строится так же, как в калькуляторе транзакций I²C.
| Операция | 100 кГц | 400 кГц | 1 МГц |
|---|---|---|---|
| Чтение 2 байт с адресом регистра: S, адрес+W, регистр, Sr, адрес+R, 2 байта, P | 471,4 мкс | 116,2 мкс | 46,5 мкс |
| Запись 32 байт с двухбайтовым адресом (EEPROM): S, адрес+W, 2 байта адреса, 32 байта, P | 3,163 мс | 0,790 мс | 0,316 мс |
| Доля данных при записи 32 байт | 80,9 % | 81,0 % | 81,0 % |
Короткие транзакции датчиков используют шину хуже всего: из 45 тактов чтения двух байт данных только 16. Для EEPROM таблица показывает только время на шине — после STOP микросхема ещё записывает страницу во внутреннюю память и до конца записи (время tWR из её даташита) не отвечает на свой адрес.
CAN 2.0A и 2.0B
Классический кадр данных CAN по спецификации Bosch 2.0 — 44 + 8n бит в стандартном формате (идентификатор 11 бит) и 64 + 8n бит в расширенном (29 бит), от SOF до конца EOF, где n — число байт данных, от 0 до 8. После каждого кадра идёт межкадровый интервал из 3 рецессивных битов. От SOF до конца последовательности CRC передатчик после пяти одинаковых битов вставляет противоположный — вставку битов. Их число зависит от данных; наибольшее — , где g = 34 для стандартного и 54 для расширенного кадра (Davis и др., 2007).
| Байт данных | Стандартный кадр, бит | Худший случай, бит | Кадров/с на 500 кбит/с (худший) | Доля данных (худший) |
|---|---|---|---|---|
| 0 | 47 | 55 | 9091 | 0 % |
| 1 | 55 | 65 | 7692 | 12,3 % |
| 2 | 63 | 75 | 6667 | 21,3 % |
| 4 | 79 | 95 | 5263 | 33,7 % |
| 8 | 111 | 135 | 3704 | 47,4 % |
Длины в таблице включают межкадровый интервал. Расширенный кадр с 8 байтами — 131 бит без вставленных битов и 160 в худшем случае, 3125 кадров в секунду на 500 кбит/с. Даже с полными кадрами больше половины времени шины CAN уходит на служебные поля. Кадр по битам с реальным числом вставленных битов строит калькулятор кадра CAN, а про протокол в целом — статья о шине CAN.
Modbus RTU
По спецификации Modbus over Serial Line символ RTU занимает 11 бит: старт-бит, 8 бит данных, бит чётности и стоп-бит, а без чётности — два стоп-бита. Режим 8N1 с 10-битным символом встречается у многих устройств, но в спецификацию не входит — калькулятор считает и его. Кадр — адрес, код функции, данные и CRC из двух байт, кадры разделяет тишина не короче 3,5 символа; выше 19 200 бит/с спецификация рекомендует фиксированные 1,750 мс.
Режим «Опрос 03» считает полный цикл чтения регистров хранения: запрос из 8 байт, тишина t3,5, задержка ведомого, ответ из 5 + 2n байт и снова t3,5:
| Скорость | 1 регистр | 10 регистров | 125 регистров |
|---|---|---|---|
| 9600 бит/с | 25,2 мс | 45,8 мс | 309,4 мс |
| 19 200 бит/с | 12,6 мс | 22,9 мс | 154,7 мс |
| 115 200 бит/с | 4,93 мс | 6,65 мс | 28,6 мс |
Таблица — без задержки ведомого. Реальные устройства отвечают через единицы и десятки миллисекунд, поэтому на высоких скоростях цикл почти целиком состоит из этой задержки: задайте её в поле «Задержка ответа ведомого». Формат кадра и CRC разбирает калькулятор Modbus RTU, протокол — статья о Modbus RTU.
USB Full Speed, передачи bulk
Скорость линии USB Full Speed — 12 Мбит/с, кадр — 1 мс, то есть 1500 байтовых интервалов. Транзакция bulk на Full Speed несёт пакет данных не больше 8, 16, 32 или 64 байт и по таблице 5-9 спецификации USB 2.0 стоит ещё 13 байт: 3 байта синхронизации, 3 байта PID, 2 байта адреса точки с CRC5, 2 байта CRC16 и межпакетная пауза длиной 3 байта. В кадр помещается столько транзакций, сколько влезает целиком:
| Данных в транзакции | Транзакций в кадре | Полезных байт в кадре | Полезная скорость |
|---|---|---|---|
| 8 байт | 71 | 568 | 568 кБ/с |
| 16 байт | 51 | 816 | 816 кБ/с |
| 32 байта | 33 | 1056 | 1,056 МБ/с |
| 64 байта | 19 | 1216 | 1,216 МБ/с |
Таблица спецификации не учитывает вставку битов: USB вставляет ноль после шести единиц подряд перед кодированием NRZI. В разделе 5.11.3 худший случай оценён как 7/6 времени данных; с ним в кадр помещаются только 17 транзакций по 64 байта — 1088 байт. Это оценки сверху для шины, на которой нет других устройств: пакеты SOF, повторы после NAK и паузы хост-контроллера в таблицу не входят. Про типы передач — в глоссарии, типы передач USB, про шину в целом — статья о USB.
Что калькулятор не учитывает
- Время, которое программа тратит между сообщениями: задайте его полем «Пауза после сообщения».
- Ошибки и повторы: кадры ошибок CAN, повторы Modbus по таймауту, NAK и повторные транзакции USB.
- Арбитраж и чужой трафик на общей шине: у CAN и I²C сообщения других узлов, у USB — других устройств.
- Растяжение такта I²C и время готовности ведомого: если датчик держит SCL, транзакция длится дольше.
Сравнивая интерфейсы, помните и про скорость линии: в UART она ограничена погрешностью тактирования — проверьте делитель калькулятором скорости UART, а скорость бод и бит/с совпадают только у двухуровневого кода.
Частые вопросы
Сколько байт в секунду передаёт UART на 115 200 бод?
В формате 8N1 на каждый байт уходит 10 битовых интервалов: старт-бит, 8 бит данных и стоп-бит. Значит, не больше 11 520 байт в секунду, или 80 % от 115 200. С чётностью или двумя стоп-битами символ длиннее на бит, и остаётся 10 473 байта в секунду. Это потолок для непрерывного потока; паузы между байтами, которые оставляет программа, снижают его дальше.
Сколько кадров CAN в секунду проходит на 500 кбит/с?
Стандартный кадр с 8 байтами данных без вставленных битов занимает 108 бит и ещё 3 бита межкадрового интервала — около 4505 кадров в секунду. В худшем случае к нему добавляются 24 вставленных бита, всего 135 бит, — 3704 кадра. Для расчёта загрузки шины и времени ответа берут худший случай: сколько битов вставит контроллер, зависит от идентификатора и данных.
Почему опрос Modbus RTU такой медленный?
Каждый цикл — это запрос из 8 байт, пауза 3,5 символа, ответ и ещё одна пауза, а символ RTU занимает 11 бит. Чтение 10 регистров на 9600 бит/с длится около 46 мс даже без задержки ведомого, и полезных данных в нём только 20 байт — 36 % времени линии. Читайте больше регистров за раз: 125 регистров за один запрос поднимают долю данных до 67 %.
Почему USB Full Speed не даёт 12 Мбит/с?
12 Мбит/с — скорость линии. Каждая транзакция bulk несёт до 64 байт данных и 13 байт служебных: синхронизацию, идентификаторы пакетов, CRC и межпакетную паузу. По таблице 5-9 спецификации в кадр 1 мс помещается 19 таких транзакций, 1216 байт данных, — 1,216 МБ/с без учёта вставленных битов. Реальные устройства получают меньше: хост делит кадр с другими устройствами и вставляет свои паузы.
Источники
- Robert Bosch GmbH. CAN Specification Version 2.0, 1991 — часть B: разд. 3.2.1 — поля кадра данных стандартного и расширенного формата, 3.2.5 — межкадровый интервал (intermission, 3 бита), 6 — вставка битов от SOF до конца последовательности CRC
- R. I. Davis, A. Burns, R. J. Bril, J. J. Lukkien. Controller Area Network (CAN) schedulability analysis: Refuted, revisited and revised. Real-Time Systems, vol. 35, 2007 — разд. 2.1.3, формула (1): наибольшая длина кадра с вставленными битами и межкадровым интервалом — 135 бит у стандартного кадра с 8 байтами и 160 у расширенного (эталон тестов)
- NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — разд. 3.1.5 — байт из 8 бит и бит подтверждения; 3.1.10 и рис. 11–13 — запись, чтение, комбинированный формат с повторным START; табл. 11 — минимальные tHD;STA, tSU;STA, tSU;STO и tBUF для Standard-mode, Fast-mode и Fast-mode Plus
- Modbus Organization. MODBUS over Serial Line Specification and Implementation Guide V1.02, 2006 — разд. 2.5.1 — символ RTU из 11 бит (без чётности — два стоп-бита), кадр до 256 байт; 2.5.1.1 — тишина 3,5 символа между кадрами, выше 19 200 бит/с рекомендованы фиксированные 750 мкс и 1,750 мс
- Modicon. Modbus Protocol Reference Guide PI-MBUS-300 Rev. J, 1996 — рис. 14 и 15: запрос функции 03 — адрес, функция, начальный адрес, количество, контрольная сумма; ответ — адрес, функция, счётчик байт, по два байта на регистр, контрольная сумма
- USB-IF. Universal Serial Bus Specification, Revision 2.0 (пакет usb_20_20250603) — разд. 5.8.3 — пакеты bulk на Full Speed 8, 16, 32 или 64 байта; 5.8.4 и табл. 5-9 — 13 байт накладных на транзакцию, 19 транзакций по 64 байта и 1216 полезных байт в кадре, бит-стаффинг не учтён; 5.11.3 — худший случай бит-стаффинга 7/6 времени данных; 7.1.9 — ноль после шести единиц подряд
Где пригодится
- Сколько регистров можно прочитать одним запросом Modbus?125 на чтение, 123 на запись, 2000 и 1968 битов — из-за PDU в 253 байта
- Почему Serial.print замедляет программу Arduino?Буфер 64 байта полон — print ждёт линию; на 9600 бод ~1 мс на байт
- Какую скорость реально даёт W5500?Потолок задаёт SPI: 8 Мбит/с у Arduino Uno, десятки Мбит/с у быстрых контроллеров
- Почему ENC28J60 теряет пакеты при подключении к коммутатору?Нет автосогласования дуплекса: режимы платы и порта должны совпадать вручную
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/bitrate-throughput/" title="Полезная скорость последовательных интерфейсов" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/bitrate-throughput/">Полезная скорость последовательных интерфейсов</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?