» Статьи о COM-портах » Аппаратное управления потоком
Аппаратное управления потоком
Сигнал Clear To Send, сокращенно — CTS, поступает от модема к компьютеру, и его активные уровень означает, что компьютер может передавать данные в сторону модема, пассивный уровень означает что модем «просит» компьютер приостановить передачу данных. Таким образом, этот сигнал прежде всего предназначен для приостановки потока данных от компьютера к модему, и для ограничения эффективной (средней) скорости передачи.
В бытность, когда компьютеры и деревья были большими, а скорости передачи маленькими, CTS часто использовался как «вентиль», с помощью которого устройство (модем) может организовать получение данных от компьютера не равномерным потоком, а по одному байту.
По этой схеме работали многие простейшие устройства, которые могли обрабатывать данные только побайтно и не содержали в себе буфера способные накопить не один байт, а целую порцию.
При такой схеме работы, сигнал CTS изменяется дважды для передачи каждого байта данных. Каждое изменение сигнала CTS требует реакции со стороны компьютера (генерирует аппаратное прерывание и обрабатывается драйвером), но при малых скоростях передачи это не было большой проблемой. Но как только скорости передачи данных возросли, и в UART-контроллерах были реализованы FIFO-буфера, организация с помощью CTS такой побайтной схемы обмена стала невозможной. Как только уровень CTS станет пассивным, компьютер перестанет пополнять FIFO передатчика, но все что уже было в FIFO «выстрелит» в сторону устройства (модема).
Чтобы всегда принимать данные без потерь модем (или другое устройство) должен иметь буфер как минимум на два байта больше чем размер FIFO в компьютере. У многих современных UART-контроллеров размер FIFO находиться в диапазоне 64-256 байт, и если производитель модема посчитал, что 32 байта для входящего буфера будет достаточно — у вас будут проблемы. Для решения этой проблемы в драйвере SerialXp предусмотрено ограничение заполнения FIFO передатчика (параметр «LimitTxFifo»), либо можно вообще просто отключить FIFO.
Однако частое изменение CTS конечно будет продолжать тратить процессорное время.
Поэтому в правильно спроектированных модемах входной буфер имеет размер не менее 1024 байт (обычно от 2048 до 4096), сигнал CTS становиться пассивным, как только этот буфер заполняется на 3/4, и вновь становиться активным при заполнении 1/4.
При «побайтовом» обмене, даже при отключении FIFO, проявляется еще одна проблема. На UART-контроллере с аппаратной ошибкой потери прерывания (см. ниже), любое изменение CTS может быть «забыто» контроллером и не замечено компьютером. При использовании стандартного драйвера, это фактически приводит к невозможности взаимодействия с устройством. Драйвер SerialXp имеет механизм восстановления после «потери прерывания», однако реакция драйвера будет не моментальной, а спустя системный «тик» времени, что дополнительно замедлит итоговую скорость передачи.
30.12.2024

