Используются два подхода.
В прошлом было принято использовать аппаратное управление потоком. При этом используется дополнительный провод в каждом направлении. Отправитель ждет, пока провод не покажет, что получатель готов. Когда приемник не готов к приему данных, он сигнализирует другой стороне. Аппаратные средства буферизуют хотя бы один байт и, если буфер заполнен, сигнализируют другой стороне не отправлять по этому проводу.
Это менее распространено сегодня. UART настолько медленны по сравнению с современным оборудованием, а большие буферы настолько дешевы и просты в обеспечении, что проблема больше не возникает. Отправитель просто заполняет аппаратный буфер получателя, а получатель периодически очищает аппаратный буфер. Программное обеспечение должно будет долго игнорировать буфер, чтобы он переполнился.
Промежуточным решением является использование управления потоком в потоке данных. Как правило, два символа зарезервированы, один для остановки потока и один для его возобновления. Получатель отправляет символ управления потоком отправителю, если его буфер приближается к полному, и еще один, если его буфер приближается к пустому. Это действительно полезно, только если поток данных не должен обрабатывать двоичные данные. Это чрезвычайно редко и традиционно использовалось главным образом для соединений, на которых был человек на одном конце. Вы также можете приостановить поток, если информация поступает быстрее, чем вы можете ее прочитать.
Как правило, используемые протоколы допускают переполнение и включают некоторую форму подтверждения высокого уровня и / или повторной передачи в зависимости от ситуации. Одно устройство может подождать, пока другая сторона отправит какой-либо ответ на свою команду, и, если оно не получит, повторите команду. Протокол предназначен для того, чтобы не делать ничего страшного, если команда получена дважды, поскольку это может быть потерянный ответ.