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

## 4. Последовательный порт и модем

Понимание принципов устройства и работы последовательного порта и модема не обязательно для установки и использования модема, но может помочь при решении возникающих проблем. Дополнительные сведения представлены в разделе Принципы работы модемов этого документа (еще не закончен). Последовательному порту посвящен отдельный Serial-HOWTO (большая часть информации этого раздела взята оттуда).

## 4.1 Модем преобразует цифровое в аналоговое (и наоборот)

Почти все магистральные линии телефонной связи являются на сегодняшний день цифровыми в отличие от линий, идущих к Вашей квартире или рабочему месту (т.н. "последняя миля" -- прим. перев.), которые все еще остаются аналоговыми, т.е. рассчитанными на передачу колебаний электрического напряжения в соответствии со звуковыми колебаниями, исходящими из Вашего рта. Такие электрические колебания называются "аналоговыми". На экране осциллографа они выглядят как синусоидальные колебания с изменяющимися частотой и амплитудой. Цифровой сигнал имеет прямоугольную форму. Например, 3 В (Вольта) могут соответствовать единичному биту (1-bit), а 0 В -- нулевому биту (0-bit). Для большинства последовательных портов (к которым подключаются внешние модемы) +12 В представляют нулевой бит, а -12 В -- единичный (для некоторых +5 В и -5 В, соответственно).

Чтобы передать данные по телефонной линии, модем берет цифровой сигнал с Вашего компьютера и преобразует его в "аналоговый". Сначала он создает аналоговую синусоиду (несущую -- прим. перев.), которую затем "МОДулирует". Т.к. получившийся сигнал все же представляет цифровые данные, то он также может называться цифровым. Но походит он больше на аналоговый сигнал, и поэтому зовется аналоговым. На другом конце телефонной линии другой модем "ДЕМодулирует" этот сигнал и восстанавливает исконный цифровой сигнал. Сложив вместе "мод" и "дем", Вы получите слово "модем" (если опустите однух из двух букв д). "Модем", таким образом, означает МОДулятор-ДЕМодулятор. О том, что такое модуляция, можно прочитать в разделе Модуляция.

## 4.2 Что называется последовательным портом?

### Введение

Последовательный порт UART (или просто для краткости "последовательный порт") является устройством ввода-вывода (I/O). Т.к. последовательный порт является связующим звеном между модемом и компьютером, без знания его принципов не обойтись.

В большинстве случаев ПК имеет один или два последовательных порта. У каждого порта есть 9-выводной разъем (иногда 25-выводной) на задней стенке компьютера. Компьютерные программы могут отсылать данные (байты) на вывод передачи (выход) и принимать байты с вывода приема (вход). Остальные выводы служат для управления и заземления.

Последовательный порт -- это не только разъем. Последовательный порт преобразует данные из параллельного вида в последовательный и изменяет их электрическое представление. Внутри компьютера биты данных передаются параллельно (одновременно по нескольким линиям). При последовательной передаче биты идут друг за другом по одной линии. Последовательный порт должен преобразовать данные из параллельного вида внутри компьютера в последовательный на выводе передачи (и наоборот).

Почти вся электроника последовательного порта сосредоточена в одной микросхеме (или является частью большой микросхемы), известной как UART (Universal Asynchronous Receiver-Transmitter -- универсальный асинхронный приемопередатчик ). Более подробно об UART можно узнать из раздела "Что такое UART" Serial-HOWTO.

Но может Вы сперва захотите дочитать этот раздел, чтобы уяснить себе как UART входит в общую схему.

### Выводы и линии

В старых ПК применялись разъемы с 25-ю выводами, но по делу использовалось только 9 из них, поэтому в современных компьютерах разъемы последовательных портов 9-выводные. Каждый из 9 выводов соединяется с линией. Две линии используются для передачи и приема данных, один вывод (линия) является сигнальной землей. Напряжение на выводах измеряется по отношению к этой земле. Т.о., минимальное число линий для 2-сторонней передачи данных -- 3. Можно обойтись и без сигнальной земли, но тогда ухудшится производительность и могут возникнуть ошибки.

Остальные линии служат только для передачи управляющих сигналов. Все эти сигналы можно было бы "повесить" на одну линию, но вместо этого для каждого сигнала выделили отдельную линию. Некоторые из управляющих линий(или все) так и называются "управляющие линии модема". Управляющие линии модема находятся либо в разрешающем состоянии (on) +12 Вольт, либо в запрещающем (off) состоянии -12 Вольт. По одной из этих линий передается сигнал, запрещающий передачу байтов ИЗ компьютера по последовательному порту. По другой же, наоборот, передается сигнал, запрещающий передавать байты из подсоединенного к последовательному порту устройства (не только модема -- прим. перев.) В компьютер. По другим линиям модему передается команда отсоединиться от телефонной линии или сообщается компьютеру об установлении соединения или поступлении входящего звонка. См. Serial-HOWTO: Pinout and Signals (Расположение выводов и сигналы).

### Последовательный порт внутренних модемов

У внутренних модемов отсутствует 9-выводной разъем, но это не означает, что между внутренними и внешними модемами большая разница. Вместо 12 Вольт на управляющей линии во внутреннем модеме используется бит состояния (status bit) в собственной памяти (регистре), заменяющий эту линию. Взаимодействие с "последовательным портом" внутреннего модема ничем не отличается от взаимодействия с настоящим последовательным портом компьютера. Ему также можно задать максимальную скорость передачи данных, как и обычному последовательному порту, например 115200 бит/с.

К сожалению для Linux, во многих современных модемах для работы используется программное обеспечение (выполняющееся в ЦП), пригодное только для MS Windows. Т.е. не все внутренние модемы получится использовать с Linux. Увы... См. Программные модемы (винмодемы).

## 4.3 Адрес ввода-вывода (IO) и прерывание (IRQ)

Т.к. компьютеру необходимо взаимодействовать с каждым последовательным портом отдельно, то операционная система должна знать о его существовании и нахождении (адресе I/O). Ей также надо знать, какую линию (номер IRQ) использует последовательный порт для запросов на обслуживание центральным процессором компьютера. Запрос осуществляется посылом по этой линии сигнала прерывания. Поэтому каждый последовательный порт должен хранить в своей постоянной памяти и адрес I/O, и номер IRQ (Interrupt ReQuest -- запрос на прерывание). См. Прерывания. Шина PCI имеет собственную систему прерываний. Допускается разделение прерываний PCI (2 или более устройств могут использовать один и тот же номер IRQ).

Адреса I/O -- это не то же самое, что адреса памяти. Когда на адресную шину компьютера поступают адреса I/O, задействуется отдельная линия. Сигнал на этой линии сообщает основной памяти игнорировать передаваемый адрес, а всем устройствам, имеющим адреса I/O (в их числе и последовательному порту), сравнить посылаемый адрес с собственным адресом. Если адреса совпадают, то устройство принимает данные с шины данных.

Адрес I/O конкретного устройства (ttyS2, к примеру) представляет собой на самом деле диапазон адресов. Наименьший адрес в этом диапазоне называется базовым адресом. Говоря "адрес", обычно подразумевают "базовый адрес".

## 4.4 Названия: ttyS0, ttyS1 и т.д.

Последовательные порты называются ttyS0, ttyS1 и т.д. (что соответствует COM1, COM2 и т.д. в DOS/Windows). Каталог /dev имеет специальный файл для каждого порта. Наберите "ls /dev/ttyS*", чтобы их увидеть. То, что там может оказаться (к примеру) файл ttyS3, не означает, что такой последовательный порт обязательно присутствует физически.

Определить, к какому последовательному порту относится конкретное название (ttyS0, ttyS1 и т.д.), можно следующим образом. Драйвер последовательного порта (программа) содержит таблицу, показывающую какой адрес I/O соответствует данному ttyS. Данное соответствие названий (ttyS1) адресам I/O (и IRQ) можно установить и просмотреть командой "setserial". См. Setserial. Данная команда `не` меняет адрес I/O и IRQ, хранящиеся в самом устройстве (они устанавливаются перемычками (jumpers) или при помощи plug-and-play). Т.о., какому порту соответствует, скажем, ttyS1, зависит от настройки драйвера (посредством setserial) и установок в устройстве. Если где-то допустить ошибку, то последовательный порт может оказаться без названия (ttyS2, к примеру) и будет недоступен. См. Последовательные порты /dev/ttyS2 и т.д.

## 4.5 Прерывания

Байты приходят по телефонной линии в модем, в нем они преобразуются из аналоговой формы в цифровую и через последовательный порт поступают в компьютер. При получении определенного числа байтов (1, 4, 8 или 14) в буфер FIFO последовательный порт просит ЦП принять их, посылая электрический сигнал, именуемый прерыванием, по определенной линии, закрепленной обычно только за этим портом. Прерывание выполняется только после получения FIFO заданного числа байтов.

Это же прерывание посылается и при возникновении непредвиденной задержки в получении следующего байта (при таймауте). Так что, если байты принимаются медленно (например, от терминала, на котором кто-то осуществляет набор на клавиатуре), то прерывания могут следовать после каждого полученного байта. Для некоторых микросхем UART действует следующее правило: если за время, отведенное на получение 4-х подряд идущих байтов, ни один байт получен не был, то порт перестает ждать и посылает прерывание на передачу байтов, находящихся в данный момент в FIFO. Конечно, если FIFO пуст, то прерывание не посылается.

Каждая линия прерывания (внутри компьютера) имеет номер (IRQ) и последовательному порту должно быть известно, какую линию использовать для своего прерывания. Так, у ttyS0 обычно IRQ номер 4, обозначаемая как IRQ4 (или IRQ 4). Список всех номеров IRQ последовательных портов и других устройств есть в разделе "man setserial" под названием "Настройки последовательных портов" ("Configuring Serial Ports"). Прерывания выполняются всякий раз, когда последовательному порту необходимо обратить внимание ЦП на себя. Важно, чтобы они выполнялись регулярно, потому как буфер последовательного порта может хранить только 16 байтов. Если ЦП не сможет вовремя извлечь хранящиеся в буфере байты, то может произойти его переполнение, что приведет к потере данных.

Для внешних модемов способа достаточно быстро остановить поток данных для предотвращения переполнения буфера нет. У внутренних же модемов 16-байтовый буфер FIFO расположен прямо на модемной карте, и большинство модемов не осуществляет в него запись при его заполнении. Переполнения 16-байтовых буферов не происходит, но может потребоваться Управление потоком модем-модем теперь уже для предотвращения переполнения самого модема. Таково одно из преимуществ внутренних модемов над внешними.

Прерывания посылаются последовательным портом также после посыла всех байтов из буфера передачи. Прерывание извещает ЦП о том, что он может послать следующие исходящие байты в 16-байтовый буфер передачи. Наконец, прерывание выполняется, если одна из линий управления модемом изменяет свое состояние.

Все упомянутые буферы являются аппаратными. Последовательный порт имеет также большой буфер в основной памяти. О нем позже.

Прерывания косвенным образом несут с собой большое количество информации. Само по себе прерывание только лишь сообщает микросхеме контроллера прерываний, что данный последовательный порт требует к себе внимания. Контроллер прерываний в свою очередь передает это требование ЦП. ЦП, получив его, запускает специальную программу для обслуживания последовательного порта. Программа называется обработчиком прерываний (входит в драйвер последовательного порта). Она пытается определить, что произошло на последовательном порте и в зависимости от этого переслать байты в аппаратный буфер последовательного порта или наоборот, из него. Данной программе не составляет сложности определить, что произошло, т.к. по адресам IO, известных драйверу, находятся регистры последовательного порта, в которых содержится информация о его состоянии. Программа считывает содержимое регистров и по нему определяет произошедшее событие и дальнейшее действие.

## 4.6 Сжатие данных (модемом)

Прежде, чем продолжать описание последовательного порта, требуется рассказать о сжатии данных модемом. Правда, в некоторых случаях эта задача выполняется в ЦП компьютера соответствующим программным обеспечением, работающим (конечно же -- издевка перев.) только с MS Windows. Здесь мы не будем их рассматривать -- ограничимся случаем, когда сжатие осуществляется самим модемом, т.к. это необходимое условие работы модема под Linux.

Чтобы быстрее передавать данные по телефонной линии, можно сжать (закодировать) их по заданной схеме кодирования, зависящей от передаваемых данных. Закодированные данные имеют меньший объем, чем исходные (меньше байт), и могут быть переданы через Интернет за меньшее время. Это и называется "сжатием данных".

Загружаемые из Интернет файлы обычно уже являются сжатыми, и смысла в дальнейшем их сжатии модемом нет. Модем может сам определить, что проходящие через него данные уже сжаты, и не будет пытаться сжать их еще. При получении данных, сжатых другим модемом, модем восстановит их, создав большее число байтов, нежели было передано по телефонной линии. Т.е. поток данных от модема к компьютеру будет больше, чем по телефонной линии. Отношение этих потоков называется коэффициентом сжатия. Значения коэффициента сжатия может достигать 4.

## 4.7 Коррекция ошибок

Помимо сжатия данных модемы могут осуществлять коррекцию ошибок. Хотя коррекция ошибок и требует некоторых накладных расходов, уменьшающих число байт/сек скорости общего потока, но в то же время она убирает стартовые и стоповые биты, что фактически повышает скорость потока самих данных.

В интерфейсе последовательного порта к каждому 8-битному байту добавляется 2 дополнительных бита: стартовый и стоповый. При отсутствии коррекции ошибок эти биты проходят через модем и передаются далее по телефонным линиям. При включенной коррекции ошибок данные биты убираются, а 8-битные байты отдаются в пакеты. Так получается эффективнее и быстрее, несмотря на несколько байтов в заголовках пакетов и несколько байтов, добавленных в целях коррекции ошибок.

## 4.8 Поток данных (Скорости)

Данные (байты, которыми закодированы буквы, картинки и пр.) передаются от компьютера модему, от модема по телефонной линии (и также в обратном направлении). Скорость потока, называемая также просто скоростью, измеряется в бит/сек (например, 56k (56000) бит/сек). Если бы не было сжатия данных, то скорость потока от компьютера к модему была бы почти такой же, как и скорость потока данных по телефонной линии.

Фактически есть две различных скорости:

- Скорость передачи данных по телефонной линии между модемами (скорость DCE)
- Скорость между последовательным портом компьютера и модемом (скорость DTE)

Обычно при дозвоне и соединении с модемом на противоположном конце Ваш модем уведомляет об этом сообщениями вида "CONNECT 28800" или "CONNECT 115200". Они означают либо скорость DCE, либо скорость DTE. Если число превышает заявленное производителем на коробке значение скорости модема, то это скорость DTE (между модемом и компьютером). В нашем примере 115200. 28800 -- скорость DCE (между модемами), т.к. последовательный порт не имеет такой скорости. Модем можно настроить на показ любой из этих скоростей. Некоторые модемы сообщают обе скорости, а скорость между модемами показывают как (например): CARRIER 28800.

Можно подумать, что внутренние модемы не имеют ограничения по скорости DTE между модемом и компьютером, т.к. почти что являются частью компьютера. Но это не так, потому что внутренний модем имеет собственный последовательный порт. И все же, у некоторых программных модемов такого ограничения по скорости нет.

Важно понять, что средняя скорость зачастую меньше указанной, особенно на короткой линии между модемом и компьютером. Причиной этого являются задержки (ожидания). Задержки могут быть долгими, порядка секунды, вследствие управления потоком. А могут быть очень короткими, несколько микросекунд, между концом одного байта и началом следующего байта. К тому же, модемы снижают скорость при ухудшении условий на линии.

Обсуждение выбора скорости DTE представлено в разделе Какую установить скорость.

## 4.9 Управление потоком

Управление потоком означает управление скоростью потока байтов в линии. У последовательных портов оно заключается в приостановке и последующем возобновлении потока для предотвращения потери байтов. Управление потоком требуется модемам и другим устройствам при изменениях мгновенной скорости потока.

### Пример

Рассмотрим случай подключения внешнего модема 33.6k через короткий кабель к последовательному порту. Модем посылает и получает байты по телефонной линии на скорости 33,6 кбит/сек (bps). Предположим, что никакого сжатия данных и коррекции ошибок нет. Скорость последовательного порта установлена на 115200 бит/сек (bps); данные передаются с компьютера в телефонную линию. Итак, скорость потока данных от компьютера к модему составляет 115,2 кбит/сек. А скорость передачи по телефонной линии -- только 33,6 кбит/сек. В модем поступает более быстрый поток (115.2k) по сравнению с выходящим из него, образующийся избыточный поток (115.2k-33.6k=81.6k bps) сохраняется в одном из буферов модема. Если не остановить быстрый поток 115.2k, то буфер через очень малое время переполнится (закончится место для сохранения данных).

В этот момент на помощь приходит управление потоком. Когда буфер модема почти заполнен, модем посылает стоп-сигнал последовательному порту. Последовательный порт передает стоп-сигнал своему драйверу, и поток 115.2k приостанавливается. Модем продолжает отсылать данные в телефонную линию на 33.6k bps, беря их из заполненного буфера. Т.к. в буфер ничего не поступает, количество байтов в нем начинает уменьшаться. Когда почти все байты в буфере исчерпаны, модем посылает последовательному порту старт-сигнал и поток данных 115.2k из компьютера в модем возобновляется. По сути, при управлении потоком в коротком кабеле устанавливается средняя скорость потока (в данном случае 33.6k), которая значительно меньше заданной ("on") скорости потока (115.2k bps). Такое управление потоком называется "старт-стоп".

В описанном простом примере предполагалось, что сжатия данных модемом не осуществлялось. Это актуально при передаче модемом уже сжатого файла, не подлежащего дальнейшей компрессии. Рассмотрим прямо противоположный случай, когда модем сжимает данные с высоким коэффициентом сжатия. Теперь модему может даже потребоваться скорость входного потока, скажем, 115.2k bps, чтобы на выходе (в телефонную линию) получить 33.6k bps (сжатых данных). Коэффициент сжатия равен 3,43 (115,2/33,6). При таком коэффициенте сжатия модем способен сжимать поток 115.2k ПК-модем и отсылать эти данные (в сжатой форме) по телефонной линии на скорости 33.6k bps. Пока коэффициент сжатия остается выше 3,43, управление потоком не требуется. Но коэффициент сжатия меняется с каждой секундой, и при его падении ниже 3,43 необходимо включение управления потоком.

В примерах модем был внешним. Но то же самое можно сказать (на начало 2003 г.) о большинстве внутренних модемов. У них все еще присутствует ограничение скорости ПК-модем, несмотря на отсутствие кабеля. Это делает внутренние и внешние модемы схожими.

В приведенных примерах управления потоком данные передавались от компьютера к модему. Но и в противоположном направлении, от модема (или другого устройства) к компьютеру, также действует управление потоком. Для каждого направления используется 3 буфера: 1. в модеме, 2. в микросхеме UART (FIFO) и 3. в основной памяти, управляемый драйвером последовательного порта. Управление потоком защищает все буферы (кроме FIFO) от переполнения.

Под Linux маленькие буферы FIFO в UART не защищены механизмом управления потоком, и система полагается на быстрый отклик в ответ на посылаемые прерывания. Некоторые микросхемы UART можно заставить выполнять аппаратное управление потоком для защиты своих FIFO, но Linux не поддерживает эту возможность (по данным на начало 2003 г.). FIFO означает "First In, First out" ("Первым вошел, первым вышел") и указывает на способ, которым осуществляется обработка данных в очереди ("стек обратного магазинного типа" -- еще один перевод FIFO в словаре, прим. перев.). Все 3 буфера используют метод FIFO, но только один из них -- в UART -- зовется "FIFO". Главным образом, из-за управления потоком, но не только.

При выставленной максимально возможной скорости потока ПК-модем управление потоком от модема к ПК может и не потребоваться. В Serial-HOWTO в разделе "Пример сложного управления потоком" рассмотрен случай, когда такое управление потоком нужно. Чтобы остановить этот входящий поток, модем должен попросить противоположный модем прекратить посыл. См. Управление потоком модем-модем.

### Аппаратное и программное управление потоком

По возможности следует использовать аппаратное управление потоком, при котором по двум "управляющим линиям модема" передаются сигналы "стоп" и "старт". Аппаратное управление потоком работает так: Используется два вывода последовательного порта: RTS (Request to send -- Запрос на передачу) и CTS (Clear to send -- Готов к приему). Когда компьютер готов к получению данных, он устанавливает положительное напряжение на выводе RTS (тем самым говоря: "Прошу выслать мне что надо"). Когда компьютер начинает не справляться с приемом байтов, он переводит вывод RTS в состояние с отрицательным напряжением, сообщая этим: "Мне пока хватит". Вывод RTS соединяется через последовательный кабель с подходящим выводом модема, принтера, терминала и т.д., только отслеживающим состояние вывода последовательного порта.

Для модема этим "подходящим" выводом будет его вывод RTS. Но для принтера, другого ПК или еще какого-либо "немодемного" устройства таким выводом обычно является вывод CTS, поэтому для соединения необходим "кроссоверный" (перекрестный) или "нуль-модемный" кабель. Этим кабелем соединяются вывод CTS на одном конце с выводом RTS на другом конце (таких проводников в кабеле два, как и концов). Модем подсоединяется к последовательному порту "прямым" (straight-thru) кабелем.

В противоположном направлении действует схожая схема. Вывод CTS у модема используется для передачи управляющего сигнала на вывод CTS ПК. У "немодемного" устройства сигнал отсылается через вывод RTS. Т.е. роль вывода CTS модема у "немодема" выполняет вывод RTS. В некоторых "немодемах", например терминалах ввода-вывода, для аппаратного управления потоком могут использоваться другие выводы: DTR вместо RTS.

Программное управление потоком для передачи сигналов "старт" и "стоп" использует основные линии приема и передачи данных. Сигналы "старт" и "стоп" программного управления потоком представляют собой управляющие символы ASCII DC1 (старт) и DC3 (стоп), которые при необходимости просто вставляются в идущий поток данных. Данный тип управления потоком не только является более медленным, но и не позволяет без принятия специальных мер передавать двоичные данные. Т.к. двоичные данные наверняка содержат символы DC1 и DC3, то надо каким-то образом отличать символ DC3 управления потоком от символа DC3, являющегося частью двоичных данных. То же самое касается и DC1. Для работы программного управления потоком с двоичными данными необходима соответствующая поддержка как со стороны модема, так и со стороны программ.

### Признаки отсутствия управления потоком

Понимание управления потоком может оказаться полезным. К примеру, я в течение нескольких месяцев использовал свой модем для доступа в Интернет, и все вроде бы было прекрасно. Но в какой-то момент попытался я было послать несколько длинных (больших, если Вам так привычнее ;) -- перев. отвлекся) файлов со своего ПК, удалось мне это после огромного числа повторов и ошибок. Прием в другом направлении (от провайдера ко мне) шел чудесно. Проблема оказалась в модеме, у которого было отключено управление потоком данных. Буфер моемого модема переполнялся от длинных исходящих файлов, т.к. никакого сигнала "стоп"от модема на мой компьютер для останова посыла данных не приходило. В направлении от модема к компьютеру такого не было, потому что пропускная способность (115,2 кбит/с, например) последовательного порта всегда выше пропускной способности телефонной линии. Проблема возникает, когда ПК шлет данные на скорости 115,2 кбит/с, модем не в состоянии их обработать, буфер переполняется. Решением было включение управления потоком путем прописывания соответствующей команды в строке инициализации модема.

### Управление потоком модем-модем

Так называется управление потоком данных, посылаемых по телефонной линии от одного модема к другому. Работает оно только при включенной коррекции ошибок. Хотя и при отсутствии коррекции ошибок можно задействовать программное управление потоком между модемами, но оно может помешать передаваемым двоичным данным, и поэтому используется нечасто.

## 4.10 Путь данных. Буферы

Как уже упоминалось, для каждого направления существует 3 буфера (всего 3 пары): 16-байтовые буферы FIFO (в UART), пара буферов большего объема в устройстве, подключенном к последовательному порту (в модеме), и пара буферов (около 8k) в основной памяти ПК. Байты, посылаемые какой-либо программой в последовательный порт, сперва попадают в буфер передачи в основной памяти. Для байтов, идущих в противоположном направлении, есть буфер приема. Примерная схема цепочки, которую проходят байты, когда Вы "бороздите просторы Интернета", показана ниже. Передача данных идет слева направо по схеме, а прием -- справа налево. Для каждого направления потока свой отдельный буфер.

    прикладная 	8-килобайтовый	 	16-байтовый 	1-килобайтовый 	теле-
    БРАУЗЕР ------- ОСНОВНАЯ ПАМЯТЬ ------- FIFO (UART) ---	МОДЕМ ---------	фонная
    программа 	буфер 			буфер 		буфер 		линия

Например, в случае передачи драйвер последовательного порта забирает, допустим, 15 байтов из буфера передачи (в основной памяти) и кладет их по одному в 16-байтовый буфер передачи в UART. Далее они попадают в модем (или другое устройство, подключенное к последовательному порту), также имеющий буфер, но большего объема (около 1k). Когда драйвер (по требованию от модема) для управления потоком останавливает поток исходящих от компьютера байтов, то на самом деле он останавливает поток байтов из большого буфера передачи в основной памяти. Т.е. при остановке передачи данных в модем программа может продолжать слать байты в 8-килобайтовый буфер передачи в основной памяти до тех пор, пока он не заполнится. Одновременно с этим байты, накопленные в FIFO, отсылаются в модем. Если от модема на другом конце телефонной линии не пришло сигнала "стоп" управления потоком модем-модем, то байты, находящиеся в модеме, отсылаются в телефонную линию.

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

К вышеизложенному можно добавить три пункта. Первый -- в некоторых UART аппартное управление потоком выполняется автоматически, т.е. при необходимости оно может остановить передачу из буферов FIFO (на настоящий момент Linux не поддерживается). Второй -- пока процесс ожидает разрешения на запись в буфер передачи, он может выполнять другие задачи. Третье -- драйвер последовательного порта (находящийся между буфером в памяти и FIFO) имеет свой собственный маленький буфер (также в основной памяти), используемый для обработки символов(?).

## 4.11 Команды модема

Команды, посылаемые программами, приходят к модему по той же линии, что и отправляемые данные. Команды представляют собой короткие ASCII-строки. К примеру, команда "AT&K3" служит для включения аппаратного управления потоком (RTS/CTS) между компьютером и модемом, а команда "ATDT5393401" -- для набора (тонального. Для импульсного набора номера есть команда "ATDP..." -- прим. перев.) номера 5393401. Заметьте, все команды начинаются с "AT". Какие-то команды, вроде включения управления потоком, предназначены для настройки модема. Остальные команды, такие как набор номера, приводят к совершению определенных действий. Всего возможно около ста различных команд. При запуске программа, работающая с модемом, первым делом посылает ему строку инициализации с командами для настройки модема. Все команды отсылаются по линии данных до установления соединения (исходящего или входящего).

Как только модем устанавливает связь с другим модемом (режим передачи данных), отправляемые компьютером модему данные прямиком попадают на другой модем и не воспринимаются как команда. Чтобы "покинуть" данный режим работы и вернуться в командный режим, в котором все посылаемые модему данные интерпретируются как команды, компьютеру надо отослать "+++" с заданными временными промежутками до и после. При корректных временных промежутках модем возвращается в командный режим. Еще одним способом перевести модем из режима передачи в командный режим является подача сигнала по специальной управляющей линии модема.

В Интернете можно найти некоторое количество списков команд модема. В разделе Web-сайты есть ссылки на пару таких списков. Наборы команд у различных моделей модемов (зависит от используемых микросхем -- прим. перев.) имеют отличия. Поэтому на одном модеме какая-то команда может работать, а на другом -- нет. Некоторые общие команды (не гарантируется, что для всех модемов) можно найти в разделе Настройка модема этого HOWTO.

## 4.12 Модуль драйвера последовательного порта

Драйвер последовательного порта -- программа, управляющая последовательным портом. В настоящее время он поставляется в виде модуля ядра (serial module). Начиная с ядер 2.2, этот модуль обычно загружается автоматически по мере необходимости. В более ранних ядрах для автозагрузки модулей должен был быть запущен `kerneld`. Модуль последовательного порта надо прописать в /etc/modules. До того, как модули ядра стали популярны в Linux, драйвер последовательного порта обычно встраивали в ядро (иногда так делают и сейчас). При встроенном в ядро драйвере соответствующий модуль загружать не надо, иначе у Вас будет два драйвера последовательного порта, запущенных одновременно, со всеми вытекающими из этого ошибками, включая возможную "I/O error" (ошибка ввода-вывода) при попытке открытия последовательного порта. Загруженные модули можно увидеть по команде "lsmod".

При загрузке модуля последовательного порта на экране появляется сообщение с информацией о существующих последовательных портах (IRQ часто показывается неверное). После того, как `setserial` сообщит драйверу (будем надеяться) правильное IRQ, появится второе сообщение, сходное с первым, но уже с заданным IRQ. См. раздел "Serial Module" (Модуль последовательного порта) в Serial-HOWTO. См. дополнительную информацию о `setserial` в разделе Setserial.

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