Модемы и факс-модемы. Программирование для MS-DOS и Windows

         

Протокол ASCII


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

Мы не рекомендуем использовать этот примитивный протокол особенно в тех случаях, когда модемы (ваш и абонента) не поддерживают протоколы коррекции ошибок, например, MNP или V.42.



Протокол Bimodem


Протокол Bimodem позволяет одновременно передавать два файла в разных направлениях. Кроме того, одновременно с передачей файлов вы можете "поговорить" с оператором удаленного компьютера при помощи клавиатуры.



Протокол Kermit


Широко известны две разновидности протокола Kermit - стандартный и Super Kermit. Протокол был разработан в Колумбийском университете в 1981 году для обеспечения связи между различными типами компьютеров, включая большие компьютеры, мини-компьютеры и персональные компьютеры. В отличие от протоколов Xmodem и Ymodem он использует для передачи данных пакеты переменной длины с максимальным размером 94 байт.

Так же как и Ymodem, протокол Kermit может передавать или принимать по несколько файлов за один сеанс.

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

В результате использования такого механизма происходит резкое сокращение времени задержки. Окно может содержать от одного до 31 пакета.

В дополнение Kermit использует также предварительную компрессию данных для увеличения эффективной скорости обмена данными.



Протокол Ymodem


Протокол Ymodem разработал Чак Форсберг (Chuck Forsberg) в 1984 - 85 годах. Протокол Ymodem похож на протокол 1К Xmodem, но имеет одно отличие: протокол Ymodem может передавать или принимать за один раз несколько файлов.

Существует модификация протокола Ymodem - Ymodem G. Протокол Ymodem G предназначен для использования с модемами, осуществляющими автоматическую коррекцию ошибок на аппаратном уровне.

Вы можете воспользоваться протоколом Ymodem G, если имеете модем с аппаратной реализацией MNP или V.42. Удаленный модем тоже должен поддерживать протокол MNP или V.42.



В протоколе Ymodem G упрощена защита от ошибок, потому что защиту данных при передаче по телефонному каналу выполняет сам модем. За счет этого протокол Ymodem G позволяет достичь более высокой скорости передачи данных.

        Не используйте протокол Ymodem G, если ваш модем не осуществляет аппаратную коррекцию ошибок. В противном случае, существует большая вероятность неправильного приема файла

Другой особенностью протокола Ymodem является то, что вместе с файлом передаются все его атрибуты. Поэтому имя файла и дата его создания останутся неизменными.



Протокол Zmodem


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

В зависимости от качества линии связи протокол Zmodem может изменять длину пакета от 64 до 1024 байт.

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

Из всех протоколов передачи файлов, описанных в этом разделе, этот протокол является самым быстрым и удобным.



Протоколы компрессии передаваемых данных


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

При использовании модемов с аппаратной поддержкой протоколов сжатия информации следует установить скорость работы COM-порта, к которому подключен модем, выше скорости работы модема. Так, если модем может работать со скоростью 2400 bps, установите скорость COM-порта 9600 bps.

Среди протоколов компрессии, реализованных на аппаратном уровне, наибольшее распространение получили протоколы фирмы Microcom - MNP5 и MNP7, а также протокол, разработанный международным консультативным комитетом по телеграфии и телефонии - V.42 bis.



Протоколы коррекции ошибок


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

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

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

Протоколы коррекции ошибок могут быть реализованы не только на аппаратном, но и на программном уровне. Аппаратный уровень реализации более эффективен. Наиболее распространенны следующие протоколы коррекции ошибок, поддерживаемые модемами на аппаратном уровне - MNP1-MNP10 и V.42.



Протоколы MNP


MNP (Microcom Network Protocols) - серия наиболее распространенных аппаратных протоколов коррекции ошибок и сжатия передаваемой информации, разработанная и реализованная фирмой Microcom. На момент написания книги известны десять протоколов MNP1 - MNP10. Приведем их характеристики:

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

MNP2 - протокол коррекции ошибок, поддерживающий асинхронный дуплексный метод передачи данных.

MNP3 - протокол коррекции ошибок, поддерживающий синхронный дуплексный метод передачи данных между модемами.

MNP4 - протокол, поддерживающий синхронный дуплексный метод передачи информации. Обеспечивает большую эффективность, чем протоколы MNP2 и MNP3. Протокол MNP4 может менять размер блоков передаваемых данных при изменении числа ошибок на линии. При увеличении числа ошибок размер блоков уменьшается, увеличивая вероятность успешного прохождения отдельных блоков.

MNP5 - протокол, использующий простой метод сжатия передаваемой информации. Символы, часто встречающиеся в передаваемом блоке, кодируются цепочками битов меньшей длины, чем редко встречающиеся символы. Дополнительно кодируются длинные цепочки одинаковых символов. Обычно при этом текстовые файлы сжимаются до 35% своей исходной длины.

Конечно, если вы передаете уже сжатые, например, архиватором ARJ данные, а в большинстве случаев это так и есть, или данные, не содержащие избыточной информации, дополнительного увеличения эффективности за счет сжатия данных модемом не происходит. Наоборот, когда модем будет пытаться сжать уже скомпрессованые данные, объем передаваемой информации может даже увеличиться.

MNP6 - протокол, который дополняет протокол MNP4 автоматическим переключением между дуплексным и полудуплексным методами передачи в зависимости от типа передаваемой информации. Протокол MNP6 также обеспечивает совместимость с протоколом V.29.

MNP7 - протокол, который по сравнению с протоколом MNP5, использует более эффективный метод сжатия данных.

MNP9 - протокол, который использует рекомендацию V.32 и соответствующий метод работы, обеспечивающий совместимость с низкоскоростными модемами.

MNP10 - протокол, предназначенный для обеспечения связи на сильно зашумленных линиях, таких, как линии сотовой связи, междугородные линии, сельские линии. Стабильность связи достигается за счет многократного повторения попытки установить связь, изменения размера пакетов и скорости передачи в соответствии с уровнем помех на линии.

Все протоколы MNP совместимы между собой снизу вверх. При установлении связи происходит установка наивысшего возможного уровня MNP-протокола. Если же один из связывающихся модемов не поддерживает протокол MNP, то MNP-модем работает без него.



Протоколы передачи файлов


В разделе "Приложение Terminal" мы рассказали, что для обмена файлами телекоммуникационные программы используют специальные протоколы передачи файлов. Для правильной передачи файлов передающая и принимающая программы должны использовать один и тот же протокол передачи файлов.

Приложение Terminal поддерживает только два протокола для передачи файлов - Kermit и CRC XModem. Эти протоколы являются далеко не самыми эффективными. Современное телекоммуникационное программное обеспечение, например, приложение COMit for Windows, позволяет обмениваться файлами, используя более эффективные протоколы, такие как Ymodem и Zmodem.

Ниже представлены описания наиболее распространенных протоколов передачи файлов.



Протоколы Xmodem


Протокол Xmodem значительно более полезен, чем протокол ASCII, так как он обеспечивает коррекцию ошибок и проверку целостности передаваемого файла. Существует три разновидности протокола Xmodem:

Xmodem (Xmodem Christensen или Xmodem Checksum)

 Xmodem CRC

 1К Xmodem

Протокол Xmodem разработал Вард Кристенсен (Ward Christensen) в 1977 году. Вард Кристенсен был одним из первых специалистов по протоколам обмена данными. В честь него этот протокол иногда называют протоколом Кристенсена (Xmodem Christensen).

При передаче файлов с помощью протоколов Xmodem формат данных должен быть следующим: 8-битовые данные, один стоповый бит, проверка на четность отсутствует. Для передачи используется полудуплексный метод, т. е. данные передаются в каждый момент времени только в одном направлении.



Расширенный набор AT-команд


Все команды, передаваемые компьютером модему, начинаются префиксом AT (ATtention - внимание) и заканчиваются символом возврата каретки (<CR>). Исключение составляют только команда A/ и Escape-последовательность +++. Они не требуют для себя префикса AT.

После префикса AT могут идти одна или сразу несколько команд. Команды могут быть отделены друг от друга символами пробела, тире, скобками. Эти символы не несут для модема никакой смысловой нагрузки и просто игнорируются.

В большинстве случаев команды могут быть написаны как заглавными, так и строчными буквами.

При передаче модему команд они сначала заносятся во внутренний буфер, который обычно имеет размер 40 символов. Команды, записанные в буфер модема, исполняются только после поступления символа возврата каретки (<CR>). Вследствие ограниченного размера буфера не следует передавать модему слишком длинные команды (больше размера буфера). Длинные команды можно разбивать на части и передавать в несколько приемов. При этом каждая часть должна начинаться префиксом AT и заканчиваться символом возврата каретки.

Если вы допустили ошибку при наборе команды, можно удалить последний символ из буфера модема, передав ему код возврата (<Backspace>).

После выполнения каждой команды модем посылает обратно компьютеру ответ (сообщение) в виде числа или слова. Этот ответ означает, выполнена ли команда или произошла ошибка.

Теперь приведем описание расширенной системы команд hayes-модемов. Для каждой команды дано ее краткое описание и рекомендации по использованию. Маленький символ n, расположенный в команде, означает число. Значения, принимаемые переменной n зависят от конкретной команды. Символ r, встречающийся в описании команды S, означает номер регистра модема.

У разных моделей модемов наборы AT-команд имеют свои особенности, поэтому все команды полностью описаны только в документации на конкретную модель модема.



Разрешить обработку прерываний


Необходимо выполнить команду STI, для того чтобы разрешить обработку прерываний с более высоким приоритетом, чем прерывание от асинхронного адаптера.



порт асинхронного последовательного адаптера имеет


Каждый COM- порт асинхронного последовательного адаптера имеет собственный разъем, через который к нему можно подключать различные устройства. Встречаются две разновидности таких разъемов DB25 и DB9.

В следующей таблице представлена разводка разъема DB25 со стороны последовательного асинхронного адаптера:

Номер контакта

Назначение контакта

Вход или выход

1

Защитное заземление (Frame Ground, FG)

-

2

Передаваемые данные (Transmitted Data, TD)

Выход

3

Принимаемые данные (Received Data, RD)

Вход

4

Запрос для передачи (Request to send, RTS)

Выход

5

Сброс для передачи (Clear to Send, CTS)

Вход

6

Готовность данных (Data Set Ready, DSR)

Вход

7

Сигнальное заземление (Signal Ground, SG)

-

8

Детектор принимаемого с линии сигнала (Data Carrier Detect, DCD). Иногда сигнал DCD обозначают как CD (Carrier Detect) или RLSD (Receive Line Signal Detect)

Вход

9-19

Не используются

20

Готовность выходных данных (Data Terminal Ready, DTR)

Выход

21

Не используется

22

Индикатор вызова (Ring Indicator, RI)

Вход

23-25

Не используются

Теперь приведем разводку разъема DB9 со стороны последовательного асинхронного адаптера:

Номер контакта

Назначение контакта

Вход или выход

1

Детектор принимаемого с линии сигнала (Data Carrier Detect, DCD). Иногда сигнал DCD обозначают как CD или RLSD

Вход

2

Принимаемые данные (Received Data, RD)

Вход

3

Передаваемые данные (Transmitted Data, TD)

Выход

4

Готовность выходных данных (Data Terminal Ready, DTR)

Выход

5

Сигнальное заземление (Signal Ground, SG)

-

6

Готовность данных (Data Set Ready, DSR)

Вход

7

Запрос для передачи (Request to send, RTS)

Выход

8

Сброс для передачи (Clear to Send, CTS)

Вход

9

Индикатор вызова (Ring Indicator, RI)

Вход


Регистр данных


Регистр данных расположен непосредственно по базовому адресу COM-порта и используется для обмена данными и для задания скорости обмена.

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

В зависимости от состояния старшего бита управляющего регистра (расположенного по адресу base_adr + 3, где base_adr соответствует базовому адресу COM-порта) назначение этого регистра может изменяться. Если старший бит равен нулю, регистр используется для записи передаваемых данных. Если же старший бит равен единице, регистр используется для ввода значения младшего байта делителя частоты тактового генератора. Изменяя содержимое делителя, можно изменять скорость передачи данных. Старший байт делителя записывается в регистр управления прерываниями по адресу base_adr+ 1.

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

Делитель, десятичная форма

Делитель, шестнадцатиричная форма

Скорость передачи, бит за секунду

1040

600h

110

768

300h

150

384

180h

300

192

0C0h

600

96

60h

1200

48

30h

2400

24

18h

4800

12

0Ch

9600

8

8h

14400

6

6h

19200

3

3h

38400

2

2h

57600

1

1h

115200

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



Регистр идентификации прерывания


После того как произошло прерывание от COM-порта, программа может прочитать значение регистра идентификации прерывания, чтобы определить причину его возникновения.

Формат регистра представлен ниже:

D0        Если бит равен единице, значит нет прерываний, ожидающих обслуживания

D2-D1 Содержит идентификатор прерывания

Значение бит

D2 D1

Причина прерывания

00

Изменилось состояние модема. Устанавливается при изменении состояния входных линий CTS, RI, DCD, DSR. Сбрасывается после чтения состояния модема из регистра состояния модема

01

Буфер передатчика пуст. Сбрасывается при записи новых данных в регистр данных

10

Данные приняты и доступны для чтения. Сбрасывается после чтения данных из регистра данных

11

Прерывание по линии состояния приемника, возникает при переполнении приемника, ошибках четности или формата данных или при состоянии BREAK. Сбрасывается после чтения состояния линии из регистра состояния линии

D7-D3 Должны быть равны 0

В файле UART_REG.H регистр идентификации прерывания определен следующим образом:

// Смещение относительно базового адреса

#define IIDR_N    2

// Регистр идентификации прерывания

typedef union _IIDR_

{

     

struct 

     

{

            

unsigned char no_inter         : 1;

            

unsigned char inter_id           : 2;

            

unsigned char reserv             : 5;

     

} bit_reg;

     

unsigned char byte;

} IIDR;



Регистр управляет режимом ответа модема


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

Если регистр S0 содержит нулевое значение, то режим автоответа выключен. Когда режим автоответа выключен и поступает вызов от удаленного абонента модем не станет отвечать. Чтобы снять трубку, надо передать модему команду ATA.

Содержимое регистра сохраняется в энергонезависимой памяти, если, конечно, она есть у вашего модема.



Счетчик сигналов звонка. Значение регистра увеличивается каждый раз, когда модему поступает сигнал звонка из телефонной линии. По истечении восьми секунд с момента последнего звонка содержимое регистра сбрасывается. Значение регистра не сохраняется в энергонезависимой памяти.



Данный регистр содержит ASCII-код Escape-символа, используемого в последовательности перехода в командный режим. Обычно он имеет значение 43, что соответствует ASCII символу '+'. Вы можете переопределить Escape-символ, записав в этот регистр ASCII-код другого символа.

Если записать в регистр S2 число, больше чем 127, происходит блокировка последовательности возврата. При этом вы не сможете переключиться из режима передачи данных в командный режим без потери связи с удаленным модемом. Содержимое регистра не сохраняется в энергонезависимой памяти.



Регистр содержит ASCII-код символа возврата каретки - <CR>. По умолчанию регистр содержит ASCII- код 13. Вы можете переопределить этот символ, записав в регистр новое значение.

Содержимое регистра не сохраняется в энергонезависимой памяти. Это гарантирует, что после выключения питания вы снова сможете использовать символ с ASCII-кодом, равным 13, для ввода AT-команд.



Регистр содержит ASCII-код символа перевода строки - <LF>. По умолчанию регистр содержит ASCII- код 10. Вы можете переопределить этот символ, записав в регистр другое значение. Содержимое регистра не сохраняется в энергонезависимой памяти.



Регистр содержит ASCII-код символа возврата <Backspace> (возврат на один символ назад). По умолчанию регистр содержит ASCII- код 8. Вы можете переопределить этот символ, записав в регистр новое значение.

Заметим, однако, что если вы запишете в регистр ASCII-код от 31 до 127, то вы не сможете использовать символ с этим кодом в командном режиме. Содержимое регистра не сохраняется в энергонезависимой памяти.



Определяет время в секундах, в течение которого при снятии трубки на линии должен появиться гудок. По умолчанию регистр содержит значение 2. В энергонезависимой памяти регистр не сохраняется.



Определяет время в секундах после набора номера, в течение которого модем должен выполнить соединение (обнаружить несущую частоту от удаленного модема). По умолчанию регистр содержит значение 30. Если в течение этого времени модем установит связь, он выдает сообщение CONNECT согласно команде ATX. Если связь не будет установлена, модем отвечает NO CARRIER. В энергонезависимой памяти значение регистра не сохраняется.



Содержит время задержки при наборе номера (в секундах), которая происходит по модификатору ',' команды ATD. По умолчанию время задержки две секунды. В энергонезависимой памяти регистр не сохраняется.



Определяет время, в течение которого модем должен принимать несущую частоту от удаленного модема. Если несущая принималась в течение этого времени, модем передает компьютеру сигнал DCD. Содержимое регистра задает время в десятых долях секунды. По умолчанию для установки DCD модем должен принимать несущую 0,6 секунды, то есть регистр содержит число 6. В энергонезависимой памяти значение регистра не сохраняется.



Определяет промежуток времени, в течение которого может отсутствовать несущая от удаленного модема и при этом не происходит разрыв связи.

Содержимое регистра задает время в десятых долях секунды. По умолчанию несущая частота может отсутствовать 0,7 секунды, то есть регистр содержит число 7. В энергонезависимой памяти значение регистра не сохраняется. Заметим, что значение регистра S10 должно быть больше значения регистра S9, иначе связь будет невозможно установить.



Используется при наборе номера по тоновой системе. Регистр определяет длительность (в миллисекундах) передачи одной цифры номера и промежутка между ними.



Регистр определяет задержку, которую необходимо выдержать перед и после передачи модему Escape-последовательности +++. Эта последовательность используется для перевода модема из режима передачи данных в командный режим.

Промежуток времени между передачей модему символов Escape-последовательности ('+') не должен превышать задержку, определенную регистром S12.

Если вы не выдержали задержку перед или после передачи модему Escape-последовательности, или если промежуток времени между передачей отдельных символов Escape-последовательности превосходит эту задержку, то модем остается в режиме передачи данных.

Регистр S12 задает временной промежуток в 0,02 сотых секунды. По умолчанию регистр содержит 50.


Регистр состояния линии


Регистр состояния линии позволяет программе определить причину ошибок, которые могут произойти при передаче данных между компьютером и COM-портом. Формат регистра представлен ниже:

D0        Данные получены и готовы для чтения, при чтении данных бит сбрасывается

D1        Ошибка переполнения. Принят новый байт данных, а предыдущий еще не был считан программой. В результате предыдущий байт потерян

D2        Ошибка четности, сбрасывается после чтения состояния линии

D3        Ошибка синхронизации. Возникает, например, при отсутствии стоп-битов в принятом байте

D4        Обнаружен запрос на прерывание передачи BREAK - длинная строка нулей

D5        Регистр хранения передатчика пуст, в него можно записывать новый байт для передачи

D6        Регистр сдвига передатчика пуст. Этот регистр получает данные из регистра хранения и преобразует их в последовательный вид для передачи. Если этот бит равен единице, то UART может принять очередной символ от компьютера

D7        Тайм-аут (устройство не связано с компьютером)

Доступ к отдельным полям регистра состояния линии можно организовать с помощью следующего объединения:

// Смещение относительно базового адреса

#define LSR_N     5

// Регистр состояния линии

typedef union _LSR_

{

     

struct

     

{

            

unsigned char in_ready               : 1;

            

unsigned char overflow               : 1;

            

unsigned char parity                    : 1;

            

unsigned char synxr                           : 1;

            

unsigned char break_detect : 1;

            

unsigned char out_ready                   : 1;

            

unsigned char shift_ready          : 1;

            

unsigned char taimout                        : 1;

     

} bit_reg;

     

unsigned char byte;

} LSR;



Регистр состояния модема


Регистр состояния модема позволяет программе определить состояние управляющих сигналов, передаваемых модемом асинхронному порту компьютера. Формат регистра состояния модема представлен ниже:

D0        Если бит D0 равен единице, линия CTS изменила состояние

D1        Если бит равен единице, линия DSR изменила состояние

D2        Если бит D2 равен единице, линия RI изменила состояние. Некоторые коммуникационные программы определяют по состоянию этого бита наличие звонка на телефонной линии

D3        Если данный бит равен единице, значит линия DCD изменила свое состояние. Некоторые коммуникационные программы определяют по состоянию этого бита, установил ли модем соединение с удаленным модемом

D4        Бит соответствует состоянию линии CTS. Эта линия используется совместно с линией RTS при реализации аппаратного управления потоком данных

D5        Бит соответствует состоянию линии DSR. Эта линия используется совместно с линией DTR при аппаратной реализации подтверждения связи

D6        Бит соответствует состоянию линии RI. Единица означает, что модем обнаружил звонок на телефонной линии

D7        Состояние линии DCD. Единица означает, что модемом получена несущая частота. Заметим, что при выполнении аналогового теста (analog test) этот бит должен содержать единицу. Если это не так, то возможно, что модем исправен (для внешних модемов), но кабель, соединяющий модем и компьютер, не полностью соответствует стандарту RS-232

Доступ к отдельным полям регистра состояния модема можно организовать с помощью следующего объединения:

// Смещение относительно базового адреса

#define MSR_N   6

// Регистр состояния модема

typedef union _MSR_

{

     

struct

     

{

            

unsigned char change_cts    : 1;

            

unsigned char change_dsr   : 1;

            

unsigned char change_ri             : 1;

            

unsigned char change_dcd  : 1;

            

unsigned char cts                                : 1;

            

unsigned char dsr                               : 1;

            

unsigned char ri                            : 1;

            

unsigned char dcd                              : 1;

     

} bit_reg;

     

unsigned char byte;

} MSR;



Регистр управления модемом


Регистр управления модемом управляет состоянием выходных линий DTR, RTS и линий, специфических для модемов - OUT1 и OUT2. Формат регистра представлен ниже:

D0        Линия DTR. Сигнал подтверждения связи. Используется модемами для разрешения передачи данных между компьютером и микросхемой UART

D1        Линия RTS. Сигнал подтверждения связи. Используется модемами для разрешения передачи данных между компьютером и микросхемой UART

D2        Линия OUT1. Для некоторых модемов при установке этого бита в единицу происходит его аппаратный сброс

D3        Линия OUT2. Если бит D3 содержит единицу, то UART может вырабатывать прерывания, а если нулю - не может

D4        Запуск диагностики при входе асинхронного адаптера, замкнутом на его выход (Digital Loopback test). Эта возможность реализована только для асинхронных портов, использующих микросхему UART 8250, или полностью совместимых с ней

D7-D5 Должны быть равны 0

Регистр управления модемом определен нами в файле UART_REG.H следующим образом:

// Смещение относительно базового адреса

#define MCR_N   4

// Регистр управления модемом

typedef union  _MCR_

{

     

struct

     

{

            

unsigned char dtr                          : 1;

            

unsigned char rts                    : 1;

            

unsigned char out1                : 1;

            

unsigned char out2                : 1;

            

unsigned char diag                 : 1;

            

unsigned char reserv       : 3;

     

} bit_reg;

     

unsigned char byte;

} MCR;



Регистр управления прерываниями


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

В режиме управления прерываниями регистр имеет следующий формат:

D0        Разрешение прерывания при готовности принимаемых данных. Если бит содержит единицу, генерация прерывания при готовности принимаемых данных разрешена

D1        Разрешение прерывания после передачи байта (когда выходной буфер передачи пуст). Если бит содержит единицу, генерация прерывания после передачи байта разрешена

D2        Разрешение прерывания по обнаружению состояния BREAK или по ошибке. Если бит содержит единицу, то при обнаружении состояния BREAK или при возникновении ошибки происходит прерывание

D3        Разрешение прерывания по изменению состояния входных линий на разъеме RS-232-C (CTS, DSR, RI, DCD). Если бит содержит единицу, то при изменении состояния линий CTS, DSR, RI, DCD COM-порт вырабатывает прерывание

D7-D4 Не используются, должны быть равны 0

Для удобства доступа к регистрам UART мы определили для каждого регистра соответствующее объединение (см. файл UART_REG.H).

Ниже мы приводим объединение, которое можно использовать для доступа к отдельным полям регистра управления прерываниями из программ на языке Си:

// Смещение относительно базового адреса

#define ICR_N            1

// Регистр управления прерываниями

typedef union _ICR_

{

     

struct

     

{

            

unsigned char in_ready         : 1;

            

unsigned char out_ready            : 1;

            

unsigned char err                          : 1;

            

unsigned char change                  : 1;

            

unsigned char reserv             : 4;

     

} bit_reg;

     

unsigned char byte;

} ICR;



Регистры модемов


Hayes-совместимые модемы имеют набор регистров, определяющих различные характеристики модема. Содержимое большинства этих регистров можно считывать и изменять программным способом. Как мы рассказали в предыдущей главе, для чтения и записи регистров модема можно использовать AT-команды ATSr? и ATSr = n, где r - номер регистра, а n - число, которое в него записывается.

Ниже мы даем описание 28 регистров модема. Для каждого регистра мы приводим его описание, диапазон возможных значений и значение, записываемое в него по умолчанию.

Современные высокоскоростные модемы с аппаратной реализацией протоколов коррекции ошибок и сжатия информации могут иметь значительно больше регистров, доступных через команды ATS. Их описание вы можете получить в документации на ваш модем.



Рекомендации CCITT для факс-модемов


Факс-модемы представляют собой более сложные устройства, чем обычные модемы. Так как они предназначены для обмена факсами с факсимильными аппаратами, то факс-модемы должны поддерживать все протоколы, с которыми работают факсимильные аппараты группы 3.

Необходимо чтобы факс-модем поддерживал как минимум одну рекомендацию CCITT по передаче данных через телефонные линии - V.27 ter, V.29 или V.17.

Рекомендация

Скорость передачи, бит/с

V.21

200

V.17

9600, 14400

V.27 bis

4800

V.27 ter

2400, 4800

V.29

7200, 9600

Протокол V.21 слишком медленный и применяется только на этапе установления связи. Далее начинают работу другие протоколы: V.17,  V.27 ter или V.29. Эти протоколы значительно быстрее и обеспечивают прием или передачу факса в полудуплексном режиме.

Но одних этих протоколов недостаточно для обмена факсимильными сообщениями. Факс-модем должен также соответствовать рекомендациям CCITT T.4 и T.30. Рекомендация CCITT T.4 определяет различные параметры факсимильных аппаратов: размер листа передаваемого документа, разрешение, направление сканирования документа, алгоритмы сжатия передаваемой графической информации.

Рекомендация CCITT T.30 регламентирует процедуру установления соединения, согласование параметров связи, передачу образа документа и завершение связи.

И наконец, в дополнение к расширенному набору AT-команд, факс-модем должен поддерживать набор команд класса 1 или класса 2, предназначенных для управления факсом.



Рекомендации CCITT для модемов


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

Рекомендация

Скорость передачи, бит/с

V.21

300

V.22

600, 1200

V.22 bis

1200, 2400

V.23

1200

V.32

4800, 9600

V.32 bis

7200, 12000, 14400

V.34

28800

Bell 103

300

Bell 212A

1200

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



Вскоре после разработки фирмой Microcom


Вскоре после разработки фирмой Microcom протоколов коррекции ошибок MNP международный консультативный комитет по телеграфии и телефонии приступил к созданию собственного стандарта. Таким стандартом стала рекомендация CCITT V.42. Модемы, соответствующие рекомендации V.42 более устойчивы и обеспечивают большую производительность, чем модемы с поддержкой протоколов MNP. Рекомендации V.42 включают в себя протоколы MNP2-MNP4, чтобы обеспечить совместимость со старыми модемами и новый протокол коррекции ошибок LAPM (Link Access Procedure for Modems). Протокол LAPM включается только в том случае, если модем соединился с другим модемом, поддерживающим рекомендацию V.42.

Некоторые торговые фирмы пытаются продать старые модемы, которые аппаратно поддерживают только протоколы MNP, а не LAPM, как модемы, совместимые со стандартом V.42. Конечно, они совместимы, но это не имеет никакого отношения к достоинствам модема. Просто рекомендации CCITT V.42 включают в себя как часть поддерживаемые этим модемом старые протоколы MNP. Поэтому при покупке модема обратите особое внимание на то, что модем должен быть не просто совместим с CCITT V.42, а полностью соответствовать V.42 (т. е. поддерживать протокол LAPM).


Рекомендация CCITT V.42 bis


Протокол V.42 bis использует метод компрессии, при котором определяется частота появления отдельных символьных строк и происходит их замена на последовательности символов меньшей длины (токены). Этот алгоритм компрессии носит название Limpel-Ziv.

За счет применения алгоритма Limpel-Ziv модемы, реализующие V.42 bis, сильнее сжимают данные, чем модемы, поддерживающие MNP5.

Модемы с V.42 более "разборчивы", чем с MNP5. Если передаваемые данные не содержат избыточной информации, они не пытаются их сжать и передают в исходном виде.



Сброс буфера передатчика


Функция используется для очистки буфера передатчика. Все данные, находящиеся на момент вызова функции в буфере, пропадают и в COM-порт не передаются.

На входе:  AH = 09h;

     

DX = номер порта:         0 - COM1, 1 - COM2, 2 - COM3,

                                                              

3 - COM4 и т. д.

На выходе: не используется.



Сброс буфера приемника


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

На входе:  AH = 0Ah;

     

DX = номер порта:         0 - COM1, 1 - COM2, 2 - COM3,

                                                              

3 - COM4 и т. д.

На выходе:     не используется.



Сброс конфигурации модема (команда Z)


Команда Z сбрасывает конфигурацию модема. Во все регистры загружаются значения, принятые по умолчанию. Значения регистров, принятые по умолчанию, берутся из энергонезависимой памяти модема или, если модем такой памяти не имеет, из постоянной памяти или определяется исходя из состояния переключателей на плате модема.

Некоторые модемы могут записать в энергонезависимую память несколько различных конфигураций. С помощью команды Zможно загрузить любую из сохраненных конфигураций. Для этого после символа Z необходимо указать номер конфигурации. Например, следующая команда загружает конфигурацию номер 1:

ATZ1 <CR>



Сброс сигналов на линиях DTR и RTS


Низкий уровень сигналов DTR и RTS сообщает модему, что компьютер не готов к приему данных через COM-порт.



Считать регистр идентификации прерывания


Может случиться, что одновременно произойдет несколько прерываний. В этом случае бит D0 регистра идентификации прерываний равен единице. Тогда перед завершением обработки прерывания необходимо обработать следующее прерывание в соответствии с состоянием битов D1, D2. Так следует поступать до тех пор, пока не будут обработаны все прерывания (бит D0 не станет равен нулю).



Сигналы интерфейса RS-232-C


Здесь мы рассмотрим порядок взаимодействия компьютера и модема, а также двух компьютеров, непосредственно соединенных друг с другом. Сначала посмотрим, как происходит соединение компьютера с модемом.

Входы TD и RD используются компьютером и модемом по-разному. Компьютер  использует вход TD для передачи данных, а вход RD для приема данных. И наоборот, модем использует вход TD для приема, а вход RD для передачи данных.

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

Рис. 5.2. Соединение компьютера и модема



Символы за секунду


Как вы узнаете позже, при передаче данных через порт последовательного асинхронного адаптера передается не только полезная информация. Обычно на каждый байт полезной информации передается два служебных бита.

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

Следовательно, фактическая скорость передачи информации для модема 2400 bps составит всего 240 символов за секунду, вместо 300.

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



Система команд hayes-модемов


После выпуска американской фирмой Hayes модемов серии Smartmodem система команд, использованная в ней, стала стандартом, которого стали придерживаться остальные разработчики модемов. Система команд, примененная в этих модемах, носит название hayes-команд, или AT-команд.

Со времени выпуска первых AT-совместимых модемов набор их команд дополнился и стал называться расширенным набором AT-команд.

Мы рассмотрим наиболее важные команды расширенного набора AT-команд. Затем изучим новые команды, применяемые в модемах с аппаратной коррекцией ошибок и сжатием передаваемой информации.

Модемы разных фирм могут поддерживать различные модификации наборов AT-команд. Поэтому дополнительно к этому разделу полезно подробно ознакомиться с документацией вашего модема.



Соединение с удаленным модемом


Передаем модему команду набора номера (ATD). В этом случае модем набирает номер и пытается установить связь с удаленным модемом. Или передаем модему команду ATS0 = 1 для перевода его в режим автоответа. После этой команды модем ожидает звонка от удаленного модема, а когда он приходит, пытается установить с ним связь (см. главу "Система команд hayes-модемов").



Соединительные кабели


Работая с COM-портами, часто приходится иметь дело с различными соединительными кабелями. В этом приложении мы приведем разводку таких кабелей.

На рисунке 8.1 представлены две модификации кабеля, применяемого для соединения компьютера и внешнего модема. Если вы используете высокоскоростной модем или модем с аппаратным сжатием передаваемой информации, вам необходимо использовать первый вариант кабеля.

Рис. 8.1.

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

Рис. 8.2. Нуль-модем

Из-за наличия двух типов разъемов - DB25 и DB9 - часто бывают нужны переходники с одного типа разъемов на другой. На рисунке 8.3 мы приводим схему такого переходника.

Рис. 8.3. Переходник для разъемов DB25 и DB9

Последняя схема, которую мы представим вашему вниманию, применяется программами проверки COM-портов компьютера, например, программой CheckIt (см. рис. 8.4). Эту схему можно также применять при отладке собственного коммуникационного программного обеспечения.

Рис. 8.4. Заглушка для COM-порта



Сообщение WM_COMMNOTIFY


Сообщение WM_COMMNOTIFY отправляется драйвером COM-порта в функцию окна и служит извещением об изменении состояния COM-порта. Такое сообщение может поступать в функцию окна при наполнении входной очереди до определенного порогового значения, изменении состояния сигналов DTR, RI, RTS и т. д.

Параметр wParam сообщения WM_COMMNOTIFY определяет идентификатор COM-порта, вызвавшего отправку сообщения.

Через младшее слово параметра lParam функция окна получает число, по которому можно судить о причине посылки сообщения WM_COMMNOTIFY. Это число может быть комбинацией следующих кодов извещения:

Код извещения

Описание

CN_EVENT

Произошло событие, разрешенное в слове событий COM-порта. Эти события разрешаются вызовом функции SetCommEventMask. После прихода сообщения WM_COMMNOTIFY с кодом извещения CN_EVENT приложение должно вызвать функцию GetCommEventMask, чтобы определить, какое именно событие произошло и сбросить событие

CN_RECEIVE

Очередь приемника содержит больше, чем cbWriteNotify байт. Пороговое значение cbWriteNotify задается одним из параметров функции EnableCommNotification

CN_TRANSMIT

Очередь передатчика содержит меньше, чем cbOutQueue байт. Пороговое значение cbOutQueue задается одним из параметров функции EnableCommNotification

Если приложение обработало поступившее ему сообщение WM_COMMNOTIFY, оно должно возвратить нулевое значение.

Сообщение WM_COMMNOTIFY с кодом извещения CN_EVENT передается только тогда, когда слово состояния событий изменяет свое значение. Приложение, которое принимает сообщение WM_COMMNOTIFY, должно каждый раз очищать слово состояния событий, для того чтобы гарантировать получение сообщений в дальнейшем.

      Использование функции EnableCommNotification для разрешения передачи сообщений WM_COMMNOTIFY с кодами извещения CN_RECEIVE и CN_TRANSMIT может вызвать генерацию ошибочных сообщений WM_COMMNOTIFY, для которых параметр NotifyStatus равен нулю. При обмене данными на высоких скоростях это может привести к аварийной ситуации и даже перезагрузке компьютера.


Для решения этой проблемы можно использовать следующие методы:

         Игнорировать все сообщения WM_COMMNOTIFY, для которых параметр NotifyStatus равен нулю

         Не использовать сообщения WM_COMMNOTIFY для событий CN_RECEIVE и CN_TRANSMIT

         Разрешить сообщение CN_EVENT для события EV_RXCHAR с помощью функций SetCommEventMask и EnableCommNotification. Сообщение формируется при поступлении во входную очередь очередного символа. Функцию EnableCommNotification следует вызывать с параметрами cbWriteNotify и cbOutQueue -1, чтобы сообщения CN_RECEIVE и CN_TRANSMIT не посылались. Этот метод продемонстрирован в приложении TTY из Windows Software Development Kit (SDK)

         Вместо использования функции EnableCommNotification приложение должно само периодически опрашивать входной буфер на наличие в нем принятых данных. Опрос можно производить по таймеру или в цикле обработки сообщений

         Заменить драйвер последовательного асинхронного адаптера COMM.DRV.

Событие CN_RECEIVE формируется в тех случаях, когда количество байт во входной очереди превышает пороговое значение cbWriteNotify, установленное функцией EnableCommNotification, или когда истекло время (тайм-аут). После формирования события CN_RECEIVE в случае превышения пороговой величины cbWriteNotify другие сообщения CN_RECEIVE не будут генерироваться до тех пор, пока количество байт во входной очереди не станет меньше значения cbWriteNotify и не превысит ее снова.

Сообщение CN_TRANSMIT создается аналогично CN_RECEIVE. Порог устанавливается параметром cbOutQueue функции EnableCommNotify. Когда количество символов в выходной очереди становится меньше, чем cbOutQueue, формируется сообщение CN_TRANSMIT. Другие сообщения CN_TRANSMIT не будут посылаться до тех пор, пока в буфере не станет больше, чем cbOutQueue символов.

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



Ниже приведен фрагмент обработчика сообщения WM_COMMNOTIFY:

//==========================================================

// Функция окна WndProc

//==========================================================

LRESULT CALLBACK _export

WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

      switch( message )

      {

             case WM_COMMNOTIFY:

             {

                   if(CN_EVENT & LOWORD( lParam ) == CN_EVENT)

                   {

                         GetCommEventMask(COMDEV( npTTYInfo ), EV_RXCHAR);   

                         return(TRUE);

                   }

                   else if(CN_RECEIVE & LOWORD( lParam ) == CN_RECEIVE)

                   {

                         return(TRUE);

                   }

                   else if(CN_TRANSMIT & LOWORD( lParam ) == CN_TRANSMIT)

                   {

                         return(TRUE);

                   }

                                      else if(LOWORD( lParam ) == 0)

                         return(TRUE);

             }

             default:

                   return(DefWindowProc(hwnd, message, wParam, lParam));

      }

}

При загрузке драйвера последовательного асинхронного адаптера он вызывает функцию CreateSystemTimer и создает таймер, посылающий сообщения драйверу каждые 100 миллисекунд. Обрабатывая сообщения таймера, драйвер просматривает состояние всех открытых COM-портов и проводит проверку тайм-аута. Период таймера изменить нельзя.


Современные микросхемы UART


Микросхема UART 8250 в ее исходном виде использовалась только в старых моделях компьютеров IBM PC и IBM XT. Современные микросхемы - UART 16450, 16550 и 16550A, изготовленные по новой технологии, позволяют достичь более высокой скорости обмена данными, а также обладают новыми аппаратными возможностями. В этой главе мы рассмотрим основные различия между 8250 и новыми микросхемами, а также приведем дополнительную информацию по программированию UART 16550A.

Опишем основные возможности различных микросхем UART:

         8250 (иногда называют 8250-B): Использовалась на первых моделях компьютеров IBM PC и IBM XT

         16450 (иногда обозначают как 8250-A): Эта микросхема используется в основном для IBM PC/AT, так как имеет большую производительность. Фактически это микросхема UART 8250, но изготовленная с использованием новой технологии. Микросхема UART 16450 дополнена регистром расширения (scratch register), имеющим адрес 3FFh (base_adr + 7). В ней также устранены ошибки в регистре разрешения прерываний и добавлена возможность перевода линии OUT2 во время проведения тестов в высокоимпедансное состояние

         16550: Практически полностью соответствует UART 16450. Добавлена возможность внутренней буферизации передаваемых и принимаемых данных. Буферы выполнены по схеме FIFO (First In First Out - первый вошел, первым вышел) или, другими словами, в виде очереди. При использовании буферизации можно заметно уменьшить число прерываний, вырабатываемых асинхронным портом. Однако из-за ошибки в микросхеме эту возможность лучше не использовать - можно потерять отдельные символы. В общем случае микросхема 16550 более быстрая, чем 16450. Дополнительно 16550 дает возможность использовать несколько каналов прямого доступа (DMA channels)

         16550A (иногда обозначают как 16550AN) Соответствует 16550, но в ней исправлены ошибки реализации буфера FIFO. Эта микросхема дает возможность использования нескольких каналов прямого доступа. 16550A, как правило, используется в компьютерах с процессорами 80386/486 и в компьютерах с RISC-архитектурой. Заметим, что, если вы хотите работать на скоростях больших, чем 9600 бит/с, вам желательно использовать именно эту микросхему.



Стандартные функции библиотеки Си


Библиотеки трансляторов Borland C++ и Turbo C содержат две функции управления портами асинхронного последовательного адаптера - bioscom и _bios_serialcom. Обе эти функции обладают одинаковыми возможностями, но функция _bios_serialcom совместима с функцией _bios_serialcom из библиотек трансляторов фирмы Microsoft. Функция bioscom помечена в документации как устаревшая и оставлена для совместимости с ранними версиями трансляторов фирмы Borland.

Функции _bios_serialcom и bioscom управляют асинхронным последовательным портом компьютера через прерывание BIOS INT 0x14. Вследствие этого функция bioscom может не работать со скоростями больше чем 9600 бит/сек. Если вам нужны программы, обеспечивающие более высокие скорости, необходимо использовать непосредственное программирование портов асинхронного последовательного адаптера.

Рассмотрим функцию _bios_serialcom более подробно. Она объявлена в файле BIOS.H следующим образом:

unsigned _bios_serialcom(   unsigned service,

                                                                           

unsigned serial_port,

                                                                           

unsigned data );

Первый аргумент функции - serial_port - определяет номер порта. Для порта COM1 этот аргумент должен быть равен 0, для COM2 - 1 и так далее.

Второй аргумент - service - определяет производимое функцией действие и может содержать одну из следующих констант:

Константа

Назначение

_COM_INIT

Инициализация последовательного порта

_COM_RECEIVE

Принять байт

_COM_SEND

Передать байт

_COM_STATUS

Определить состояние порта

Назначение третьего аргумента функции - data - зависит от значения аргумента service. Если аргумент service установлен на _COM_RECEIVE или _COM_STATUS, то значение аргумента data безразлично. Если аргумент service установлен как _COM_INIT, то этот аргумент может состоять из одного или нескольких констант, объединенных булевой операцией ИЛИ. Данные константы приведены в следующей таблице:

Константа

Назначение

_COM_CHR7

Передавать семь битов на символ

_COM_CHR8

Передавать восемь битов на символ

_COM_STOP1

Использовать один стоповый бит

_COM_STOP2

Использовать два стоповых бита

_COM_NOPARITY

Не выполнять проверки на четность

_COM_EVENPARITY

Выполнять проверку на четность

_COM_ODDPARITY

Выполнять проверку на нечетность

_COM_110

Установить скорость 110 бит/с

_COM_150

Установить скорость 150 бит/с

_COM_300

Установить скорость 300 бит/с

_COM_600

Установить скорость 600 бит/с

_COM_1200

Установить скорость 1200 бит/с

_COM_2400

Установить скорость 2400 бит/с

_COM_4800

Установить скорость 4800 бит/с

_COM_9600

Установить скорость 9600 бит/с

<
По умолчанию используется один стоповый бит, проверка на четность не выполняется, обмен происходит со скоростью 110 бит/с.

Функция возвращает 16-битное целое число. В старшем байте возвращаемого значения содержатся биты, определяющие состояние последовательного порта. Содержимое младшего байта зависит от значения параметра service, с которым вызывалась функция.

Назначение отдельных бит старшего байта представлено в следующей таблице:

Бит

Если бит установлен

15

Исчерпан лимит времени (тайм-аут)

14

Регистр сдвига передатчика свободен (пуст)

13

Регистр передатчика свободен (пуст)

12

Произошел разрыв связи (состояние BREAK)

11

Ошибка в управляющих битах (ошибка синхронизации)

10

Ошибка четности

9

Ошибка переполнения

8

Данные готовы

Когда аргумент service равен _COM_SEND, бит 15 устанавливается в единицу, если данные не могут быть переданы.

Если аргумент service равен _COM_RECEIVE и чтение байта произошло успешно, он находится в младшем байте возвращаемого функцией значения. Если чтение произошло с ошибками, это отражается битами 9, 10, 11 или 15.

Если атрибут service равен _COM_INIT или _COM_STATUS, биты младшего байта определяются следующим образом:

Бит

Значение

7

Состояние линии DCD

6

Состояние линии RI

5

Состояние линии DSR

4

Состояние линии CTS

3

Линия DCD изменила состояние

2

Линия RI изменила состояние

1

Линия DSR изменила состояние

0

Линия CTS изменила состояние

Приведем небольшой пример использования функции. В этом примере функция _bios_serialcom() сначала инициализирует последовательный порт, а затем передает символы, набранные на клавиатуре в порт, а символы, считанные из порта, - на экран компьютера (см. листинг 5.10).

Для того чтобы введенные символы отображались на экране, надо соединить выход COM-порта с входом. Или использовать два компьютера, соединенных нуль-модемом, запустив программу одновременно на обоих компьютерах.



Листинг 5.10. Файл SERIAL.C

// Программа иллюстрирует доступ к последовательному порту

// через функцию _bios_serialcom()

#include <bios.h>            // необходимо включить при

                                                         // использовании _bios_serialcom()

#include <stdio.h>

#define COM1                               0                 // первый последовательный порт

#define DATA_READY        0x100         // данные приняты и готовы для

                                                                                         // чтения

int main(void) {

      unsigned in, out, status;

      // Инициализируем последовательный порт

      // устанавливаем скорость 1200 бит/с, 8 битов на символ, один

      // стоповый бит

      _bios_serialcom( _COM_INIT, COM1, _COM_1200 |

                                                         _COM_CHR8 | _COM_STOP1);

      printf("\n\ n Для выхода нажмите клавишу [ESC]\n");

      for(;;)  {

             // Определяем состояние последовательного порта

             status = _bios_serialcom(_COM_STATUS, COM1, 0);

             // Если данные готовы, считываем их из

             // последовательного порта и выводим на экран  дисплея

             if(status & DATA_READY)

                   if((out = _bios_serialcom(_COM_RECEIVE, COM1, 0) &

                                                                                                                                                  0x7F) != 0)

                         putch(out);

             // Проверяем, не нажата ли клавиша на клавиатуре?

             if(kbhit()) {

                   // Если нажата клавиша [ESC] выходим из программы

                   if((in = getch()) == 0x1b)

                         break;

                   // В противном случае передаем код нажатой клавиши

                   // на асинхронный последовательный порт

                   _bios_serialcom(_COM_SEND, COM1, in);

             }

      }

      return(0);



}

Теперь рассмотрим функцию bioscom() из библиотеки трансляторов Borland C++ и Turbo C. Эта функция отмечена в документации на Borland C++ версии 4.0, как  устаревшая:

int bioscom(int service, char data, int serial_port);

Функция аналогична функции _bios_serialcom(), за исключением следующих моментов:

         Отличается порядок следования аргументов функции;

         Не соответствуют типы аргументов, имеющие одинаковый смысл;

Рассмотрим подробнее аргументы функции bioscom(). Первый аргумент функции - serial_port - определяет номер порта. Для COM1 этот аргумент должен быть равен 0, для COM2 - 1 и так далее.

Назначение второго аргумента функции - data - зависит от значения аргумента service. Если аргумент service равен единице (_COM_RECEIVE) или тройке (_COM_STATUS), то значение аргумента data безразлично. Если аргумент service равен нулю (_COM_INIT), то этот аргумент может состоять из одного или нескольких битовых полей (констант), объединенных булевой операцией ИЛИ (|). Данные константы приведены в следующей таблице:

Константа

Значение

0x02 (_COM_CHR7)

Передавать семь битов на символ (байт)

0x03 (_COM_CHR8)

Передавать восемь битов на символ

0x00 (_COM_STOP1)

Использовать один стоповый бит

0x04 (_COM_STOP2)

Использовать два стоповых бита

0x00 (_COM_NOPARITY)

Не проводить проверки на четность

0x18 (_COM_EVENPARITY)

Проводить проверку на четность

0x08 (_COM_ODDPARITY)

Проводить проверку на нечетность

0x00 (_COM_110)

Установить скорость 110 бит/с

0x20 (_COM_150)

Установить скорость 150 бит/с

0x40 (_COM_300)

Установить скорость 300 бит/с

0x60 (_COM_600)

Установить скорость 600 бит/с

0x80 (_COM_1200)

Установить скорость 1200 бит/с

0xa0 (_COM_2400)

Установить скорость 2400 бит/с

0xc0 (_COM_4800)

Установить скорость 4800 бит/с

0xe0 (_COM_9600)

Установить скорость 9600 бит/с

По умолчанию используется один стоповый бит, не проводится проверка на четность, обмен происходит со скоростью 110 бит/с.



Третий аргумент - service - может принимать следующие значения:

Константа

Значение

0 (_COM_INIT)

Инициализация последовательного порта

1 (_COM_RECEIVE)

Принять байт

2 (_COM_SEND)

Передать байт

3 (_COM_STATUS)

Определить состояние порта

Аналогично функции _bios_serialcom() функция bioscom() возвращает 16-битовое целое число. В старшем байте возвращаемого значения содержатся биты, определяющие состояние последовательного порта. Содержимое младшего байта зависит от значения параметра service, с которым вызывалась функция.

Возможные значения для старшего байта представлены в следующей таблице:

Бит

Если бит установлен

15

Исчерпан лимит времени (тайм-аут)

14

Регистр сдвига передатчика свободен (пуст)

13

Регистр передатчика свободен (пуст)

12

Произошел разрыв связи (состояние BREAK)

11

Ошибка в управляющих битах (ошибка синхронизации)

10

Ошибка четности

9

Ошибка переполнения

8

Данные готовы

Когда аргумент service равен _COM_SEND, бит 15 устанавливается в единицу, если данные не могут быть переданы.

Если аргумент service равен _COM_RECEIVE и чтение байта произошло успешно, принятый байт находится в младшем байте возвращаемого функцией значения. Если чтение произошло с ошибками, они конкретизируются битами 9, 10, 11, или 15.

Если атрибут service равен _COM_INIT или _COM_STATUS, биты младшего байта используются следующим образом:

Бит

Значение

7

Состояние DCD линии

6

Состояние RI линии

5

Состояние DSR линии

4

Состояние CTS линии

3

Линия DCD изменила состояние

2

Линия RI изменила состояние

1

Линия DSR изменила состояние

0

Линия CTS изменила состояние


Стандартный набор ответов модема


В следующей таблице представлены различные ответы (сообщения) модема на передаваемые ему AT-команды. Современные модемы, поддерживающие протоколы коррекции ошибок и сжатия передаваемой информации, могут возвращать другие сообщения. Их полный список можно найти в документации вашего модема.

Ответ в символьном виде

Ответ цифровым кодом

Смысл

OK

0

Модем выполнил команду без ошибок

CONNECT

1

Модем установил связь со скоростью 300 bps (после выполнения команд X1, X2, X3, X4) или со скоростью 600, 1200, 2400 bps (после выполнения команды X0)

RING

2

Модем обнаружил сигнал звонка на телефонной линии. Это сообщение модем передает компьютеру каждый раз, когда по телефонной линии поступает сигнал вызова (звонок)

NO CARRIER

3

Модем потерял несущую частоту или не получил ответ от удаленного модема

ERROR

4

Ошибка в командной строке, командный буфер переполнен или ошибка в контрольной сумме (команда I2)

CONNECT 1200

5

Модем установил связь со скоростью 1200 bps, (см. команды X1, X2, X3, X4)

NO DIALTONE

6

Отсутствие сигнала станции при снятии трубки (см. команды X2, X4)

BUSY

7

Модем обнаружил сигнал "занято" после набора номера

NO ANSWER

8

Ответ получается в случае использования в командной строке управляющего символа @, если не выполнено условие пятисекундной тишины

CONNECT 600

9

Модем установил связь со скоростью 600 bps (см. команды X1, X2, X3, X4)

CONNECT 2400

10

Модем установил связь со скоростью 2400 bps (см. команды X1, X2, X3, X4)



Структура DCB


Перейдем к подробному описанию структуры DCB (Device Control Block). Структура DCB содержит информацию, определяющую различные характеристики портов последовательного асинхронного адаптера. В структуре DCB определяется скорость передачи данных, количество бит данных и стоповых бит в передаваемых символах, устанавливается контроль четности и режим управления потоком.

Структура DCB определена в файле WINDOWS.H следующим образом:

typedef struct tagDCB

{

     

BYTE  Id;

     

UINT   BaudRate;

     

BYTE  ByteSize;

     

BYTE  Parity;

     

BYTE  StopBits;

     

UINT   RlsTimeout;

     

UINT   CtsTimeout;

     

UINT   DsrTimeout;

     

UINT   fBinary      :1;

     

UINT   fRtsDisable     :1;

     

UINT   fParity :1;

     

UINT   fOutxCtsFlow :1;

     

UINT   fOutxDsrFlow :1;

     

UINT   fDummy    :2;

     

UINT   fDtrDisable     :1;

     

UINT   fOutX  :1;

     

UINT   fInX     :1;

     

UINT   fPeChar     :1;

     

UINT   fNull    :1;

     

UINT   fChEvt       :1;

     

UINT   fDtrflow    :1;

     

UINT   fRtsflow    :1;

     

UINT   fDummy2  :1;

     

char     XonChar;

     

char     XoffChar;

     

UINT   XonLim;

     

UINT   XoffLim;

     

char     PeChar;

     

char     EofChar;

     

char     EvtChar;

     

UINT   TxDelay;

} DCB;

В файле WINDOWS.H определен также тип LPDCB - дальний указатель на структуру типа DCB:

typedef DCB FAR* LPDCB;

Опишем назначение отдельных полей структуры DCB.



Таблица векторов прерываний


Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний, занимающая первый килобайт оперативной памяти - адреса от 0000:0000 до 0000:03FF. Таблица состоит из 256 элементов - адресов обработчиков прерываний, состоящих из компонент сегмента и смещения. Эти элементы называются векторами прерываний. В первом слове элемента таблицы записано смещение, а во втором - адрес сегмента обработчика прерывания.

Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 - 0000:0004 и т. д.

Инициализация таблицы происходит частично BIOS после тестирования аппаратуры и перед началом загрузки операционной системой, частично при загрузке MS-DOS. MS-DOS может переключить на себя некоторые прерывания BIOS.



Технические параметры интерфейса RS-232-C


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

Официальное ограничение по длине для соединительного кабеля по стандарту RS-232-C составляет 15,24 метра. Однако на практике это расстояние может быть значительно больше. Оно непосредственно зависит от скорости передачи данных. Согласно McNamara (Technical Aspects of Data Communications, Digital Press, 1982) определены следующие значения:

Скорость передачи в бодах

Максимальная длина для экранированного кабеля, м

Максимальная длина для неэкранированного кабеля, м

110

1524,0

914,4

300

1524,0

914,4

1200

914,4

914,4

2400

304,8

152,4

4800

304,8

76,2

9600

76,2

76,2

Уровни напряжения на линиях разъема составляют для логического нуля -15..-3 вольта, для логической единицы - +3..+15_вольт. Промежуток от -3 до +3 вольт соответствует неопределенному значению.

Если вы подключаете внешние устройства к разъему интерфейса RS-232-C (а также при соединении двух компьютеров нуль-модемом), предварительно выключите его и компьютер, а также снимите статический заряд (подсоединив заземление). В противном случае можно вывести из строя асинхронный адаптер. Земля компьютера и земля внешнего устройства должны быть соединены вместе.



Телекоммуникационные функции


Практически все функции, которые мы будем описывать в разделе "Телекоммуникационные функции", могут быть использованы для работы с параллельным адаптером. Однако из-за ограниченного объема книги мы не приводим сведений об использовании параллельных портов компьютера.



Телекоммуникационные программы


В настоящее время широкое распространение получили операционные системы Microsoft Windows 3.1 и Microsoft Windows for Workgroups 3.11. Поэтому основное внимание мы уделим телекоммуникационным программам, предназначенным для работы с модемами и факс-модемами в среде Windows.

В первую очередь вы узнаете о телекоммуникационной программе Terminal, встроенной в операционные системы Windows 3.1 и Windows for Workgroups 3.11. Эта программа предоставляет основные средства для работы с модемами, а также позволяет передавать и принимать файлы.

Далее мы рассмотрим приложение Microsoft At Work PC Fax, входящее в состав Windows for Workgroups 3.11 и позволяющее передавать и принимать факсимильные сообщения с помощью факс-модема.

Для тех, кто предпочитает работать в среде операционной системы MS-DOS, мы опишем телекоммуникационную программу Telix и кратко расскажем о возможностях программ MTE, COMIT, BITCOM.

Прочитав эту главу, вы узнаете, как работать с обычными модемами и факс-модемами. Сможете самостоятельно передать и принять файл или факс.



Тестирование модема (команда &T)


Команда &Tn используется для тестирования модема.

С помощью команды &T0 можно прервать выполнение теста модема в любой момент. Если модем выполняет локальный аналоговый тест или удаленный цифровой тест, то перед передачей команды &T0 надо с помощью Escape-последовательности перевести модем в командный режим.

По команде &T1 модем начинает выполнять локальный аналоговый тест. Продолжительность теста определяется регистром S18. В ходе локального аналогового теста проверяется и модем и компьютер (см. рис. 2.2).

Рис. 2.2. Локальный аналоговый тест

По команде &T3 модем выполняет локальный цифровой тест (см. рис. 2.3). Этот тест используется для проверки линии связи и удаленного модема. Во время локального цифрового теста модем направляет поступающие ему данные обратно на удаленный компьютер. Для выполнения теста соединитесь с удаленным модемом, затем переключите модем в командный режим и выполните команду &T3. Оператор удаленного модема должен передать несколько проверочных сообщений. Поступив на ваш модем, они будут отправлены обратно удаленному модему. Если принятое удаленным модемом сообщение эквивалентно переданному, значит, линия и удаленный модем исправны.

Рис. 2.3. Локальный цифровой тест

Команда &T4 дает согласие на начало удаленного цифрового теста, который запрашивает удаленный модем.

Команда &T5 не дает согласия удаленному модему на начало удаленного цифрового теста.

Команда &T6 вызывает выполнение удаленного цифрового теста (см. рис. 2.4). При этом происходит проверка локального компьютера, локального модема удаленного модема и линии связи:

Рис. 2.4. Удаленный цифровой тест

По команде &T7 модем выполняет удаленный цифровой тест с самодиагностикой (см. рис. 2.5). Модем сам генерирует тестовые сообщения и подсчитывает число ошибок.

Рис. 2.5. Удаленный цифровой тест

По команде &T8 производится локальный аналоговый тест с самодиагностикой (см. рис. 2.6). При этом модем сам генерирует тестовые сообщения и подсчитывает число ошибок.

Рис. 2.6. Локальный аналоговый тест с самодиагностикой



Удалить FOSSIL-драйвер из памяти


Данную подфункцию можно использовать для удаления FOSSIL-драйвера из оперативной памяти компьютера. При этом драйвер освобождает телефонную линию, восстанавливает все перехваченные им векторы прерываний и возвращает адрес своего блока MCB. Далее вы можете воспользоваться функцией 49h прерывания INT21h для освобождения этого MCB.

На входе:  AH = 0E0h;

     

AL = 05h.

На выходе:     BX = адрес MCB или 0 в случае ошибки.

Приведем пример программы UNINST, удаляющей FOSSIL-драйвер из памяти. Исходный текст этой программы представлен в листинге 6.16.

Листинг 6.16. Файл UNINST.C

int uninstall(void);

//********************************************************

// Функция main

//********************************************************

void main(void) {

     

int  ok;

     

ok = uninstall();

     

printf("Удаление FOSSIL-драйвера из памяти %s.",

                  

(ok) ? "прошло успешно" : "невозможно" );

}

//********************************************************

// Функция uninstall

//********************************************************

int uninstall(void) {

     

int  ok = 0;

     

asm {

            

// Определяем адрес MCB блока драйвера

            

mov     ax,0E005h

            

int  14h

            

// В случае ошибки возвращаем управление

            

cmp     bx,0

            

je          no_uninstall

            

// es = bx

            

push    bx

            

pop      es

            

// Освобождаем MCB блок, используемый драйвером

            

mov     ah,49h

            

int  21h

            

mov     ok,1

     

}

     

no_uninstall:

     

return(ok);

}



Управление факс-модемами


Подобно модемам, поддерживающим набор AT-команд управления, факс-модемы также используют специальные AT-команды. В настоящее время существуют два различных стандарта на такие команды. Они называются командами класса 1 и командами класса 2. Ваш факс-модем может поддерживать один или оба класса команд управления.

Чтобы определить без документации, является ли ваш модем факс-модемом, а также узнать, какие классы команд управления он поддерживает, введите команду AT+FCLASS=?.

В ответ на эту команду модем может вернуть строку, в которой через запятую будут перечислены цифры 0, 1 и 2. Например, можно получить строку "0,1" или "0,1,2". Цифра 0 означает, что факс-модем может работать в режиме обычного модема и передавать цифровые данные. Цифры 1 и 2 означают, что модем поддерживает команды класса 1 и 2 соответственно.

Если ваш модем вернул в ответ на команду AT+FCLASS=? строку ERROR, то, скорее всего, это означает, что он не может работать в режиме обмена факсимильными сообщениями.

Модем может вернуть в ответ на команду AT+FCLASS=? строку OK. Возможно, такой модем может быть использован в качестве факс-модема. Более подробную информацию о его возможностях можно получить из документации или с помощью команды ATI.

Обычно сразу после включения питания факс-модем работает как обычный модем и не реагирует на команды класса 1 и 2 (за исключением команды +FCLASS). Чтобы переключить факс-модем в режим факсимильной связи, предназначена команда AT+FCLASS=n.

После передачи факс-модему команды AT+FCLASS=1 он начинает воспринимать команды класса 1, но не реагирует на команды класса 2. Чтобы факс-модем начал воспринимать эти команды, ему необходимо передать команду AT+FCLASS=2. Факс-модем станет откликаться на команды класса 2, но перестанет реагировать на команды класса 1. Передав модему команду AT+FCLASS=0, вы вернете его в исходный режим обычного модема.

Чтобы узнать, какие значения n поддерживает ваш факс-модем, следует передать ему команду AT+FCLASS=?. Можно также узнать текущий режим работы факс-модема. Для этого предназначена команда AT+FCLASS?.


Если вы не собираетесь разрабатывать собственное программное обеспечение, предназначенное для обмена факсимильными сообщениями, то команды управления факс-модемом (кроме AT+FCLASS) вам не пригодятся.

Поскольку разработка такого обеспечения является достаточно сложной задачей, требующей знания рекомендаций CCITT T.4 и T.30, мы приведем только краткий список команд факс-модема класса 1 и класса 2.

В следующей таблице перечислены команды класса 1:

Команда

Назначение

AT+FRH

Инициализирует прием данных в соответствии с протоколом HDLC

AT+FTH

Инициализирует передачу данных в соответствии с протоколом HDLC

AT+FTM

Передача факсимильных данных

AT+FRM

Прием факсимильных данных

AT+FTS

Передача паузы

AT+FRS

Прием паузы

AT+FAA

Выбор режима автоматического ответа

Список команд класса 2 значительно шире, чем набор команд класса 1 и позволяет более полно задействовать все возможности факс-модема:

Команда

Назначение

AT+FMFR?

Выдать идентификатор фирмы-производителя факс-модема

AT+FMDL?

Выдать идентификатор модели факс-модема

AT+FREV?

Выдать идентификатор версии модели факс-модема

AT+FDCC?

Выдать параметры устройства

AT+FDIS?

Выдать параметры текущего сеанса связи

AT+FDCS?

Выдать согласованные параметры текущего сеанса связи

AT+FLID?

Выдать идентификатор станции

AT+FPTS

Состояние передачи страницы

AT+FCR

Возможность приема факсимильных сообщений

AT+FAA

Режим автоответа

AT+FBUF

Размер буфера факс-модема

AT+FPHCTO

Определение тайм-аута

AT+FAXERR

Значение кода ошибки

AT+FBOR

Порядок следования бит данных

AT+FDT

Передача данных

AT+FET=N

Передать пунктуацию страницы

AT+FDR

Начать или продолжить прием данных

AT+FK

Завершить сеанс связи

В следующем примере мы показываем, как использовать команды класса 2 для определения фирмы-производителя, идентификатора и версии модели факс-модема:

AT+FMFR?

ROCKWELL

OK

AT+FMDL?

RC32ACL

OK

AT+FREV?

CES-03 931216

OK


Управление эхо-выводом команд (команда E)


Команда En управляет эхо-выводом символов, передаваемых модему. После команды E1 модем возвращает каждый знак, передаваемый ему, обратно компьютеру, что позволяет проверить, как работает связь модема и компьютера. Команда E0 или просто E запрещает эхо-вывод.



Управление линией DTR


Функция 06h используется для управления линией DTR. Заметим, что на состояние линии DTR кроме этой функции влияет только функция инициализации FOSSIL-драйвера.

На входе:  AH = 06h;

     

DX = номер порта:         0 - COM1, 1 - COM2, 2 - COM3,

                                                              

3 - COM4 и т. д.;

     

AL = состояние линии DTR:

            

01h - установить сигнал DTR;

            

00h - сбросить сигнал DTR.

На выходе: не используется.



Управление модемами


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

В командном режиме вы можете передавать с вашего компьютера модему команды, управляющие его работой. Компьютер передает модему команды через COM-порт точно так же, как данные для обмена с удаленным модемом.

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

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

         При удавшейся попытке установления связи с другим модемом он автоматически переходит в режим передачи данных

         При выполнении модемом процедур самотестирования.

Модем переходит из режима передачи данных в командный режим в следующих случаях:

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

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

         При поступлении модему от компьютера команды в момент набора модемом номера

         При передаче от компьютера модему специальной Escape-последовательности.



Управление несущей частотой (команда C)


По команде C0 модем прекращает передачу несущей частоты. Команда C1 восстанавливает передачу несущей частоты. Данная команда поддерживается не всеми модемами.



Управление обработкой сигнала BREAK от удаленного модема (команда \K)


Команда \Kn определяет действие модема после получения им сигнала BREAK от компьютера или удаленного модема.

Рассмотрим, что происходит при получении модемом сигнала BREAK от компьютера, когда модем находится в стандартном режиме или в режиме коррекции ошибок (в режиме MNP).

\K0, \K2, \K4  модем переходит в командный режим без передачи сигнала BREAK удаленному модему.

\K1      модем освобождает свои буферы.

\K3      модем не освобождает свои буферы.

\K5      модем передает сигнал BREAK удаленному модему. Этот режим установлен по умолчанию.

Теперь рассмотрим, что происходит при получении модемом сигнала BREAK от компьютера, когда модем находится в режиме прямой передачи.

\K0, \K2, \K4  модем не передает сигнала BREAK удаленному модему.

\K1, \K3, \K5  модем передает сигнал BREAK удаленному модему.

Наконец рассмотрим что происходит при получении модемом сигнала BREAK от удаленного модема, находится в стандартном режиме.

\K0, \K1    модем освобождает свои буферы.

\K2, \K4    модем не освобождает свои буферы.

\K4, \K5    модем передает сигнал BREAK.

Более подробную информацию о команде \K можно получить из документации на ваш модем.