Следующий Предыдущий Содержание

## 14. Какую установить скорость?

Здесь под "скоростью" ("speed") на самом деле понимается "скорость передачи потока данных" ("data flow rate"). Все современные модемы сами, без Вашего участия, автоматически выбирают максимально возможную скорость, которая достижима в условиях определенной телефонной линии. Если один модем медленнее другого, то соединение установится на скорости более медленного модема. На зашумленной линии скорость передачи данных будет ниже.

В отличие от скорости передачи данных по телефонной линии, которая автоматически выбирается модемами, скорость между модемом и компьютером (скорость ПК-модем) задается Вами. Эту скорость иногда называют "скорость DTE", где "DTE" означает Data Terminal Equipment (оконечное оборудование) (Ваш компьютер является оконечным оборудованием.) Вам надо установить данную скорость достаточно высокой, чтобы эта часть пути, проходимого сигналом, не стала узким местом. Значение скорости DTE задается максимальным для данного соединения. Большую часть времени обмен между компьютером и модемом будет проходить на более низких скоростях.

Для внешнего модема скорость DTE -- это скорость (в бит/с) передачи данных по кабелю, соединяющему Ваши модем и ПК (через последовательный порт). Для внутреннего модема идея та же, поскольку последовательный порт эмулируется самим модемом. Может показаться странным, что связь между компьютером и картой модема, подсоединенной непосредственно к внутренней намного более скоростной шине компьютера, имеет ограничение по скорости. Но обычно так и есть, потому что карта модема имеет свой последовательный порт с ограничением по скорости (и доступными скоростями). Однако, у некоторых программных модемов такого ограничения нет.

## 14.1 Скорость и сжатие данных

Какую скорость Вам выбрать? Если бы не было сжатия данных, то можно было бы попробовать задать скорость DTE точно такой же, как и скорость модема (скорость передачи по телефонной линии -- разъясн. перев.). Со сжатием данных байты, посылаемые модему компьютером, преобразуются (кодируются по определенным алгоритмам) модемом в меньшее число байтов. Например, если поток (скорость) от ПК к модему составляет 20000 байт/с (bps), а коэффициент сжатия равен 2 к 1, то по телефонной линии будет передаваться только 10000 байт/с. Таким образом, при коэффициенте сжатия 2:1 скорость DTE надо задать равной удвоенной максимальной скорости модема. Если коэффициент сжатия был бы 3 к 1, то надо было бы задать утроенное значение и т.д.

## 14.2 Где задается скорость?

Обычно скорость DTE (ПК-модем) устанавливается в меню программы, используемой для установки соединения, или опцией команды getty при приеме звонков. Скорость DCE между модемами (DCE -- Data Communication Equipment; оборудование передачи данных, к которому относится модем) устанавливается автоматически максимально возможной модемом при согласовании связи с модемом на другом конце линии -- сами Вы ее не задаете. Конечно, можно задать скорость модем-модем с помощью регистра S37, но этого делать не стоит Если два модема на линии будут настроены таким образом на разные скорости, то они не смогут друг с другом связаться.

## 14.3 Не могу выставить высокую скорость

### Скорости свыше 115,2 кбит/с

С середины 1990-х годов максимальная скорость в 115,2 кбит/с была стандартом. Но с 2000-го года большинство новых последовательных портов поддерживают более высокие скорости: 230,4 и 460,8 кбит/с. А некоторые поддерживают даже 921,6 кбит/с. Увы, Linux почти не использует эти скорости из-за отсутствия драйверов. Поэтому такие порты работают как порты со скоростью 115,2 кбит/с. Пока что, до включения поддержки таких высоких скоростей в стандартный драйвер последовательного порта,приходится пересобирать (компилировать) ядро, используя специальные патчи, или же использовать специальные модули (?), чтобы задействовать эти скорости.

К сожалению, производители не пришли к единому соглашению относительно высокоскоростных последовательных портов, поэтому надо, чтобы драйвер последовательного порта поддерживал различные порты от различных производителей. Высокие скорости в Linux можно устанавливать стандартным способом -- заданием значения baud_base с помощью setserial (если драйвер сам этого не делает). Если значение baud_base равно самой максимальной скорости, то при делителе 1 должна быть эта самая максимальная скорость :) Все это, надеюсь, будет реализовано в ядре Linux где-то к 2003 году (надо бы поинтересоваться -- заметка перев.).

Драйвер для микросхемы w83627hf (используемой на многих материнских платах, в том числе на Tyan S2460) есть на https://www.muru.com/linux/w83627hf/

Нестандартный способ, применяемый некоторыми производителями высокоскоростных портов, заключается в использовании очень большого числа как делителя для задействования высоких скоростей. Это число на самом деле не является делителем, поскольку ничего не разделяет. Оно лишь служит кодом, указывающим последовательному порту, какая требуется скорость. Для таких портов надо перекомпилировать ядро, используя специальные патчи.

Один такой патч для поддержки высокоскоростных портов данного типа называется shsmod (Super High Speed Mode -- режим сверхвысокой скорости). Он существует в двух версиях: для Windows и для Linux. См. http://www.devdrv.com/shsmod/. Существует также модуль ядра для микросхемы VIA VT82C686: http://www.kati.fi/viahss/. При его использовании может произойти переполнение буфера.

Только для небольшого числа внутренних модемов заявляется, что их встроенные последовательные порты могут работать на скорости свыше 115,2 кбит/с. Поддерживает ли их shsmod??

### Как скорость задается аппаратно (в последовательном порте): делитель и базовая скорость (baud_base)

Скорость задается путем изменения частоты тактового генератора последовательного порта. Происходит изменение не самой частоты (физической, если можно так сказать -- перев.) задающего генератора, а ее "деление". Например, при делении на два просто игнорируется каждый второй такт. Скорость при этом уменьшается наполовину. При делении на 3 получаем 1/3 от начальной частоты и т.д. Т.е. чтобы снизить частоту (тем самым задав скорость), мы отсылаем тактовому генератору последовательного порта значение делителя. Точнее, это делает драйвер, записывая делитель в регистр порта. Итак, скорость устанавливается делителем.

Если генератор работает на предельной скорости 115000 bps (как правило), то делители для различных скоростей будут такие (предполагается, что максимальной скоростью будет 115200 бит/с): 1 (115.2k), 2 (57.6k), 3 (38.4k), 6 (19.2k), 12 (9.6k), 24 (4.8k), 48 (2.4k), 96 (1.2k) и т.д. Драйвер задает скорость последовательному порту, отсылая только "делитель" (положительное целое число). "Делитель" делит (такая уж у него работа :) -- перев. просит прощения за тавталогию :)) "максимальную скорость" порта -- тем самым получается меньшая скорость (кроме делителя 1, при котором порт работает на максимальной скорости).

Определенные высокоскоростные порты являются исключениями: в них скорости свыше 115.2k задаются очень большим значением делителя. Стоит учитывать это в дальнейшем. Обычно, если Вы устанавливаете скорость 115.2k (в программе для установки связи или через stty), то драйвер задает последовательному порту делитель 1, соответствующий самой высокой скорости.

Не во всех высокоскоростных портах используются большие значения делителя. Высокие скорости могут задаваться обычным способом. Скажем, если у Вас есть последовательный порт с максимальной скоростью 230.4k, то, указывая в программе скорость 115.2k и задавая этим делитель 1, Вы фактически получаете 230.4k. И так для любой скорости -- фактическая скорость будет в два раза больше указываемой в программе (делители те же, а делимая максимальная скорость выше вдвое, не 115.2k, а 230.4k -- догадка перев.:)). Если у Вас порт с максимальной скоростью 460.8k, то фактические скорости будут в четыре раза выше задаваемых (по той же причине -- перев.). При этом предполагается, что Вы не проводили изменения с помощью "setserial".

### Задание делителя, пересчет скорости

Сделать так, чтобы фактическая скорость соответствовала указываемой в программе, можно, задав с помощью "setserial" baud_base равным максимальному значению скорости Вашего порта, тем же 230.4k (этот способ не всегда срабатывает). После этого для задания 230.4k надо указывать (в программе или через stty) именно 230.4k, делитель будет равен 1.

Если у Вас есть старая программа, которая не позволяет задавать такие высокие скорости, то можно воспользоваться параметром "spd_cust". В этом случае фактическое значение скорости будет определяться параметром "divisor" (делитель), который также устанавливается setserial, программе же можно указать скорость 38400 бит/с. Но я все же не рекомендую использовать этот прием.

Для портов (UART), в которых используются большие значения делителя, нормального способа задать высокую скорость с помощью setserial нет: если установить большое значение делителя ("divisor 32770"), то setserial при этом будет думать, что скорость очень низкая, и отключит FIFO в UART..

### Частота кристалла (кварцевого генератора) выше, чем baud_base

Значение baud_base обычно на порядок меньше, чем частота кварцевого генератора: частота генератора, скажем, 1,8432 МГц делится на 16 и получается максимальная скорость 115.2k. Более высокая частота генератора требуется для того, чтобы можно было для каждого бита взять несколько отсчетов с целью определения: 1 или 0 (?).

В действительности, и "частота кристалла" 1,8432 МГц может задаваться генератором 18,432 МГц, преобразовываясь в требуемую делителем на 10 перед подачей в UART. Возможны и другие схемы задания частоты.

## 14.4 Таблица скоростей

Для модемов, поддерживающих скорости 56k, лучше всего подходит 16650 UART, но он встречается нечасто. Другим подходящим вариантом является 16550, "разогнанный" до 230400 бит/с (230.4k). Большинство же все еще использует 16550 со скоростью только 115,2 кбит/с. Но, как утверждается, передача данных из-за этого замедляется всего лишь на несколько процентов (в среднем). Объясняется это тем, что коэффициент сжатия обычно 2 к 1, а при передаче сжатых файлов (пакетов) и вовсе 1 к 1. В таких случаях, очевидно, никакого замедления быть не должно (всё это актуально, если у Вас для начала есть 56k в телефонной линии -- от перев.). Соответствие между значением скорости последовательного порта и скоростью модема (протоколом) следующее:

- 56k (V.92) -- 115,2 кбит/с или 230,4 кбит/с (лучше)
- 56k (V.90) -- 115,2 кбит/с или 230,4 кбит/с (лучше)
- 33.6k (V.34bis) -- 115,2 кбит/с
- 28.8k (V.34) -- 115,2 кбит/с
- 14.4k (V.32bis) -- 57600 бит/с
- 9.6k (V.32) -- 38400 бит/с
- медленнее 9600 bps (V.32) -- скорость порта можно задать такой же, как скорость модема (если нет сжатия данных).

Все указанные протоколы могут работать вместе с протоколом сжатия данных V.42bis и протоколом коррекции ошибок V.42. Если сжатия данных нет, то скорость порта можно задать меньше, но не меньше скорости модема. (Задаю максимальную скорость для порта и не задумываюсь. -- от перев.)

Следующий Предыдущий Содержание