Что такое инициализация модема
Настройка интернет соединения через USB модем
1. Подключаем USB-модем к компьютеру.
Устройство определяется системой и требует драйвера,
устанавливаем драйвера с самого модема (эмулятор CD), с флэшки или компакт-диска.
2. В «Диспетчере устройств» находим модем и заходим в его свойства.
Смотрим номер COM-порта на который установился модем (может пригодиться для отлучения модема от оператора).
И заполняем строку инициализации модема (точка доступа оператора).
Чтобы не менялся COM-порт модема и не приходилось проверять строку инициализации,
следует включать модем всегда в один и тот же USB-порт.
Для модема с SIM-картами разных операторов в системе может быть несколько устройств.
Строки инициализации для разных операторов связи:
Мегафон: AT+CGDCONT=1,»IP»,»internet»
МТС: AT+CGDCONT=1,»IP»,»internet.mts.ru»
Теле 2: AT+CGDCONT=1,»IP»,»internet.tele2.ru»
БиЛайн: AT+CGDCONT=1,»IP»,»internet.beeline.ru»
9. Завершаем настройку, нажимая «Готово»
10. Имеем готовое соединение для подключения к интернету
которое можно сделать соединением «по-умолчанию» в браузере
11. Можно настроить свойства соединения под свои потребности
которое можно сделать соединением «по-умолчанию» в браузере
Настройка роутера через мобильный модем
Представленный вашему вниманию обзор, о том как подключить Wi-Fi роутер через мобильный 3G, 4G модем это универсальный метод абсолютно для любой модели wi-fi роутера и от марки производителя не зависит. Отличия лишь в оформлении интерфейса раздела настроек, в названиях и расположении самих разделов настроек. Внимание! Убедитесь, что ваш роутер имеет поддержку мобильных модемов выбранного вами оператора. Эту информацию вы найдете в инструкции раздел «спецификация устройства» или на сайте производителя. Данное руководство подойдет для любого провайдер, предоставляющих услуги мобильного интернета — Мегафон, МТС, Билайн, Yota, Tele2, SkyLink и всех остальных мобильных операторов!
Этапы настройки
1. Берем ваш USB-модем от оператора мобильного интернета и вставляем и вставляем его в USB порт на роутере, а кабель Ethernet (или патчкорд), который идет в комлпекте с роутером, первым концом в разъем LAN на роутере, вторым — в сетевую карту вашего компьютера.
2. На вашем персональном компьютере (под управлением Windows 7) заходим в раздел сетевых настроек, делаем это по такому пути: Пуск => Панель Управления => Сеть и Интернет => Центр управления сетями и общим доступом => Управление сетевыми подключениями => Изменения параметров адаптера.
Нажимаем правой кнопкой мыши по пункту «Подключение по локальной сети» далее «Свойства» потом в пункт меню Протокол Интернета который «TCP/IPv4» и выбираем следующие пункты «IP автоматически» и «DNS сервера автоматически»
Сохраняем, нажимаем «ОК».
3. На роутера (с его обратной стороны) находим IP адрес, который используется для входа в админку роутера (как правило это — 192.168.0.1), и доступы (зачастую login:admin, password: admin)
4. Открываем ваш любимый браузер и пишем там где адресная строка — 192.168.0.1 (или тот другой, который указан на роутере), и залогиниваемся.
5. Смотрим на меню роутера и находим пункт «USB модем» ( или может быть 3G/4G или настройка USB и т.п. варианты), активируем его и вводим в указанные на изображении поля данные для вашего оператора.
Приведу список настроек для большинства мобильных операторов, но напомню актуальные настройки ищите у своего мобильного оператора.
Что такое инициализация модема
правда, по-нерусски, но реестр на том же языке
Или прямо так:
(Прошу прощения, что не кодом, но в коде теги не работают, и главного не выделить)
;*****************Overriding Unimodem settings***********************
«Prefix»=»AT»
«Terminator»=» »
«DialPrefix»=»D»
«DialSuffix»=»;»
«Pulse»=»P»
«Tone»=»T»
«Blind_Off»=»X4»
«Blind_On»=»X3»
«CmdSendDelay»=»500»
«CallSetupFailTimeout»=»ATS7=# »
«Reset»=»AT «
; What is Location ID (value name) for the current location
«CurrentLoc»=dword:0
; What is the next permanent location ID to be used when creating a new entry
; Each MultiSz location (value name = PermLocationID» has :
; LocationName, LocalFmt, LdFmt, IntntlFmt, AreaCode, CwCode, CountryCode, & Options
И заработало! Пошел делать бэкап.
biz_zon,
напиши plz что к чему и чем подключал
Added @ 10.10.2007, 00:58
И тутже возникла следующая проблемма:
Я пользуюсь двумя теоефонами (CDMA и GSM) для CDMA необходима строка инициализации, с которой всё работает,
а для GPRS на GSM такая строка не нужна и он перестаёт работать если она внесена.
Включаем блютус на КПК и коннектимся с телефоном,
в телефоне авторизуем КПК, чтобы не подтверждать каждую попытку коннекта
Руками в [HKEY_LOCAL_MACHINE\Drivers\Unimodem\Confg] скорость (Baudrate) изменяем на необходимую.
Имхо, это скорость обмена данными между КПК и телефоном, а телефон с базовой станцией о скорости договаривается самостоятельно
Настройка GPRS: AT-команды модема, настройка GPRS оборудования, описание
*99# и *99***1# это не номера, а так называемые AT-команды встроенного модема мобильного телефона.
99 – это один из сервисных кодов доступа в сеть GPRS (еще есть 98).
1 – это так называемый параметр CID (Context Definition ID), который указывает, какую настройку строки инициализации использовать (в данном случае CID 1, она обязательно предварительно должна описываться там с помощью команды AT+CGDCONT=1. ).
* – разделители между параметрами.
Таким образом, в строке инициализвции можно задать еще настройку CID 2 (AT+CGDCONT=2. ) и при необходимости вызывать набором #99***2#
Текущие настройки модема мобильного телефона можно прочитать какой-нибудь терминальной программой, послав в модем команду AT+CGDCONT?
Общие настройки GPRS.
Ниже, представлена краткая информация по настройке компьютера для использования GPRS через Московских операторов сотовой связи. Эти настройки Вы можете использовать как при подключении через GPRS-модемы, так и через телефоны. Подробнее, читайте в соответствующих разделах сайта (для «МТС», для «Билайн», для «Мегафон» и для «Tele2»).
Настройки компьютера для МТС.
Тип сервера удаленного доступа: PPP: Windows 95/98/NT 4/2000, Internet.
Уберите все «галки», за исключением TCP/IP в области «Допустимые сетевые протоколы».
Нажмите кнопку «Настройка TCP/IP» и в появившемся окне установите следующие параметры:
Адрес IP назначается сервером.
Адреса вводятся вручную.
Первичный адрес DNS: 213.087.000.001.
Вторичный адрес DNS: 213.087.001.001.
Включите «Использовать стандартный шлюз для удаленной сети».
Отключите «Использовать сжатие заголовков IP».
Login и password: mts.
Номер дозвона: *99# (для некоторых моделей телефонов номер другой).
Настройки компьютера для Билайн.
Тип сервера удаленного доступа: РРР: Windows 95/98/NT 4/2000, Internet.
Уберите все «галки», за исключением TCP/IP в области «Допустимые сетевые протоколы».
Нажмите кнопку «Настройка TCP/IP» и в появившемся окне установите следующие параметры:
Адрес IP назначается сервером.
Адреса вводятся вручную.
Первичный адрес DNS: 194.067.002.114.
Вторичный адрес DNS: 194.190.195.066.
Включите «Использовать стандартный шлюз для удаленной сети».
Отключите «Использовать сжатие заголовков IP».
Login и password: beeline.
Номер телефона: *99# (для некоторых моделей телефонов номер другой).
Настройки компьютера для Мегафон.
Тип сервера удаленного доступа: РРР: Windows 95/98/NT 4/2000, Internet.
Уберите все «галки», за исключением TCP/IP в области «Допустимые сетевые протоколы».
Нажмите кнопку «Настройка TCP/IP» и в появившемся окне установите следующие параметры:
Выберите Адрес IP назначается сервером
Выберите Адреса вводятся вручную
Выберете Получить адреса DNS сервера автоматически
Включите «Использовать стандартный шлюз для удаленной сети».
Отключите «Использовать сжатие заголовков IP».
Имя пользователя gdata и пароль gdata
Номер дозвона: *99# (для некоторых моделей телефонов номер другой).
Ну а подсоединить телефон к компьютеру (кабель или ИК-порт), полагаем, Вы сможете самостоятельно. В принципе, если четко следовать инструкции, процесс подключения займет не более 10 минут, так что дерзайте.
Настройки компьютера для Tele2.
Тип сервера удаленного доступа: РРР: Windows 95/98/NT 4/2000, Internet.
Имя пользователя: Оставить пустым
Пароль: Оставить пустым
Первичный DNS: 000.000.000.000
Вторичный DNS: 000.000.000.000
Что такое инициализация модема
В этой главе мы рассмотрим основные принципы программирования модемов и приведем две коммуникационные программы.
Доступ к модему происходит через последовательный асинхронный порт. При этом для передачи модему команд их необходимо просто записать в регистр данных COM-порта, на котором находится модем. Ответ от модема также поступает через последовательный порт. Передавая модему команды, его можно проинициализировать, перевести в режим автоответа или заставить набрать номер.
Когда модем наберет номер удаленного абонента или когда модему в режиме автоответа придет вызов, он попытается установить связь с удаленным модемом. После установления связи модем передает компьютеру через COM-порт специальное сообщение (см. главу «Система команд hayes-модемов») и переключится из командного режима в режим передачи данных. После этого данные, передаваемые модему, перестают восприниматься им как команды и сразу передаются по телефонной линии на удаленный модем.
Итак, после установления связи с удаленным модемом, коммуникационная программа может начинать обмен данными. Обмен данными так же, как и передача команд, осуществляется через COM-порт. Затем при помощи специальной Escape-последовательности можно переключить модем из режима передачи данных обратно в командный режим и положить трубку (AT-команда ATH0), разорвав связь с удаленным модемом.
Принципы обмена данными с внешними устройствами через COM-порт представлены в главе «Программирование асинхронного адаптера».
В зависимости от режима, в котором находится модем, он может передавать компьютеру различные сообщения. Например, если модем производит вызов удаленного модема (AT-команда ATD), то модем может выдать следующие сообщения:
CONNECT | успешное соединение |
BUSY | номер занят |
NO DIALTONE | на линии отсутствует сигнал коммутатора |
NO ANSWER | абонент не отвечает |
NO CARRIER | неудачная попытка установить связь |
Когда приходит звонок, модем передает компьютеру сообщение RING, если регистр модема S0 равен нулю. В этом случае для ответа на звонок надо послать модему команду ATA. Если модем находится в режиме автоответа и регистр модема S0 не равен нулю, то модем автоматически пытается ответить на звонок и может выдать следующие сообщения:
CONNECT | успешное соединение |
NO DIALTONE | на линии отсутствует несущая частота от удаленного модема |
NO CARRIER | неудачная попытка установить связь. |
Если модем передал компьютеру сообщение CONNECT, значит, он успешно произвел соединение и теперь работает в режиме передачи данных. Теперь все данные, которые вы передадите модему через COM-порт, будут преобразованы модемом в форму, пригодную для передачи по телефонным линиям, и переданы удаленному модему. И наоборот, данные, принятые модемом по телефонной линии, переводятся в цифровую форму и могут быть прочитаны через COM-порт, к которому подключен модем.
Низкий уровень сигналов DTR и RTS сообщает модему, что компьютер не готов к приему данных через COM-порт.
При работе с асинхронным последовательным адаптером (COM-портом) вы можете использовать механизм прерываний. Глава «Программирование асинхронного адаптера» содержит теоретические сведения по этому вопросу, а в главе «Коммуникационная программа, использующая прерывания» содержится исходный текст коммуникационной программы, использующей прерывания для работы с COM-портом. Если ваша программа использует прерывания от COM-порта, она должна содержать обработчик прерываний, а также программировать контроллер прерываний для разрешения прерываний.
Так как передача и прием данных модемом представляют собой длительный процесс, то применение прерываний от COM-порта позволяет использовать процессорное время для других нужд.
Сейчас мы приведем, возможно, не очень полезную, но очень простую программу, работающую с модемом. Эта программа может только передавать команды модему. Принимать данные от модема и выполнять другие функции, присущие программам работы с модемом, она не может.
Программа работает следующим образом: сначала устанавливает сигнал DTR, который сообщает модему, что компьютер готов к обмену данными. Далее, не дожидаясь от модема ответного сигнала DSR, начинает передавать команды модему. После передачи всех символов команды модему передается байт с кодом возврата каретки, при приеме которого он выполняет посланную ему команду.
Отметим, что чтение кода возврата этой программой не выполняется, поэтому рано или поздно возникнет ошибка (переполнение буфера).
Приведем сначала исходный текст функций для управления линией DTR:
Теперь приведем текст функции to_modem(), обеспечивающей передачу команд модему:
Теперь перейдем собственно к самой программе. Как вы можете видеть, она содержит всего несколько строк на Си:
Сначала мы рассмотрим вариант коммуникационной программы без использования прерываний от асинхронного порта. Этот вариант несколько проще, так как нам не надо создавать довольно нетривиальный обработчик для этого прерывания, а также программировать контроллер прерываний.
Итак, приступим. Как мы сказали ранее, первым шагом при программировании модема надо считать инициализацию COM-порта (микросхемы UART), к которому подключен модем.
Инициализация COM-порта
Сначала надо перевести в неактивное состояние линии DTR и RTS, которые сообщают модему, что компьютер готов к обмену данными. Для этого надо записать нулевое значение в регистр управления модемом:
Затем сбрасываем регистры состояния линии, состояния модема и данных. Это достигается простым считыванием значений этих регистров:
Эти регистры необходдимо сбросить для того, чтобы в дальнейшем не мешали старые значения, которые могли остаться от работы других программ. Так, если программа, ранее работавшая с COM-портом, не считала из регистра данных байт, принятый через COM-порт, то он «дождется» запуска нашей программы и попадет в приемный буфер.
Для задания скорости обмена данными надо перевести регистр данных и регистр управления прерываниями в режим ввода значения делителя частоты тактового генератора. Этот режим устанавливается записью единицы в старший бит регистра управления:
Затем надо определить формат данных. Для этого записываем новое управляющее слово в управляющий регистр:
Последним шагом в инициализации регистров UART можно считать установку регистра управления прерываниями. Хотя наша программа не использует прерывания COM-порта, мы должны специально указать последовательному адаптеру, что он не должен генерировать прерывания.
Чтобы запретить генерацию прерываний, надо просто записать значение ноль в регистр управления прерываниями:
На этом этап инициализации регистров UART можно считать законченным. Теперь COM-порт подготовлен для обмена через него данными с модемом, но модем пока еще не будет воспринимать данные от компьютера. Чтобы перевести его в рабочее состояние, ему передаются сигналы DTR и RTS, сообщающие, что компьютер готов к обмену данными. В ответ на эти сигналы модем должен вернуть компьютеру сигналы DSR и CTS (см. главу «Аппаратная реализация»):
После этого уже можно передавать модему через COM-порт AT-команды. Таким образом, следующим этапом является уже непосредственно инициализация модема.
Инициализация модема и установление связи
Когда выполнена инициализация регистров COM-порта, он готов к обмену данными с модемом. И мы можем передавать модему AT-команды и принимать от него ответ на них.
При инициализации модема с помощью AT-команд можно установить различные параметры и режимы работы модема. Например, можно управлять формой сообщений от модема (цифровая или словесная), включать и выключать динамик модема и т.д. Список таких команд представлен в главе «Система команд hayes-модемов».
Модем выполняет переданные ему команды и возвращает ответ, который вы можете прочитать через COM-порт, к которому подключен модем. Сообщения модема представлены в главе «Система команд hayes-модемов».
Выполнив инициализацию модема, можно перейти к процедуре установки связи. Существует два основных режима установки связи: активный вызов, когда модем сам набирает номер, и режим автоответа, когда модем находится в состоянии ожидания звонка от удаленного модема.
Активный вызов удаленного модема
Для активного вызова модемом абонента надо послать модему соответствующую AT-команду. Например, для набора номера 926-76-34 модему посылается следующая команда:
Восприняв эту команду, модем сразу снимает трубку, набирает номер и пытается установить связь с удаленным модемом. Результат выполнения этой команды можно считать через COM-порт.
Ниже приведен фрагмент кода, который передает модему символы, принятые от клавиатуры и отображает на экране символы, принятые от модема:
Если модем ответил сообщением CONNECT, значит, он удачно произвел соединение и переключился в режим обмена данными. Теперь для передачи данных удаленному модему их надо просто передавать в COM-порт, к которому подключен модем. Передача и прием данных выполняются так же, как передача команд и прием ответных сообщений от модема. Вы даже можете использовать для этого те же функции.
Режим автоответа
В случае режима автоответа, модем ожидает звонка от вызывающего модема. Если регистр модема S0 содержит значение ноль, то режим автоответа отключен и, если придет звонок из линии, модем, не снимая трубки, передаст компьютеру сообщение RING. Коммуникационная программа самостоятельно распознает это сообщение и при необходимости снимает трубку и установливает связь, передав модему команду ATA.
Если регистр S0 не равен нулю, то модем пропустит определенное этим регистром число звонков, а затем самостоятельно снимет трубку и установит связь с вызывающим модемом.
В остальном работа коммуникационной программы в режиме автоответа соответствует режиму активного вызова удаленного модема.
Обмен данными с удаленным модемом
Установив связь с удаленным модемом, оба модема переходят в режим обмена данными. Теперь можно начинать передавать и принимать данные. Так же как и в случае командного режима, в режиме обмена данными с удаленным модемом передача и прием данных осуществляются через COM-порт, к которому подключен модем.
Исходный текст коммуникационной программы S_CHAT
В этой главе мы объединим все сказанное выше в одной программе. Программа состоит из следующих модулей:
Рассмотрим подробнее каждый модуль программы. Самый верхний уровень представляет модуль S_CHAT.C. Он содержит определение главной процедуры программы S_CHAT.
Отметим, что включаемые файлы, используемые в этой программе, приведены в приложении «Включаемые файлы для программ».
Затем выполняется функция dtr_on(), определенная в модуле DTR.C. Эта функция посылает сигналы DTR и RTS, сообщающие модему о готовности компьютера к обмену данными.
На этом подготовительный этап можно считать завершенным. Теперь уже можно передавать модему данные через COM-порт. Так как при включении питания модем находится в командном режиме, то мы можем передавать ему AT-команды и устанавливать связь с удаленным модемом.
В этой программе при помощи функции to_modem(), определенной в модуле TO_MODEM.C, на модем подается команда «AT M1 DP 251 2762». Эта команда включает динамик модема (AT M1) и набирает номер (AT DP 251 2762). Если модем набрал номер, он переходит в режим обмена данными с удаленным модемом, а если связь установить не удалось (занят номер), модем остается в командном режиме.
Вы можете убрать из программы передачу команды набора номера и сразу после установки сигналов DTR и RTS передавать управление функции exchange(). В этом случае для набора номера вам надо самому ввести с клавиатуры команду ATDP и нужный номер, а затем нажать клавишу Enter.
Для окончания работы программы вам достаточно нажать клавишу ESC. При этом происходит перевод модема в командный режим.
Перевод модема в командный режим осуществляется передачей ему специальной Escape-последовательности «+++». Для этого сначала выполняется временная задержка 2,5 секунды (продолжительность задержки определяется регистром модема S12, по умолчанию одна секунда). Затем при помощи функции com_out() из модуля TO_MODEM.C модему передаются три знака ‘+’ и опять выполняется временная задержка. Временная задержка выполняется функцией delay(), определенной в модуле TIMER.C:
После того как модем положил трубку, программа сбрасывает сигналы DTR и RTS. На этом выполнение программы завершается.
Итак, модуль S_CHAT.C:
Обратите внимание, что в этой программе жестко указан номер используемого COM-порта, к которому подключается модем. Вам надо перед трансляцией программы изменить в модуле S_CHAT директиву:
#define COM_PORT 2 // используется порт COM3
По номеру COM-порта, указанному вами, функция com_address() из модуля COM_ADR.C определит адрес базового регистра данного COM-порта. Вычисление базового адреса COM-порта производится в соответствии с областью переменных BIOS:
Модуль RESET.C содержит определение функции reset(). Функция reset() сбрасывает значения регистров управления модемом, состояния линии, состояния модема и данных.
Модуль COM_INIT.C содержит определение функции com_init(), которая используется нами для инициализации регистров COM-порта. Этой функции вы должны передать структуру типа AUX_MODE (определена в файле sysp_com.h), поля которой определяют скорость обмена и формат данных:
Модуль TO_MODEM.C определяет функции to_modem() и com_out(). Эти функции используются для передачи модему данных через COM-порт.
Функция to_modem() позволяет передать модему строку символов. После передачи последнего символа в строке дополнительно передается символ возврата каретки (ASCII-код 13). Эту функцию удобно использовать для передачи модему AT-команд.
Итак, приведем исходный текст модуля TO_MODEM.C:
Модуль FROM_MDM.C содержит определение функции from_modem(), которая позволяет получить данные от модема. Это могут быть данные, принятые модемом от удаленного абонента, или ответ модема на переданную ему AT-команду.
Модуль DISP.C является вспомогательным и определяет функцию disp(), используемую для вывода символов на экран непосредственно через видеопамять. Непосредственный вывод в видеопамять использован нами потому, что функции putch() и printf() работают слишком медленно. На больших скоростях модем может передать в COM-порт несколько новых символов, в то время как функция putch() еще не вывела ни одного.
Если ваша коммуникационная программа будет использовать прерывания, то можно организовать буфер принимаемых данных и при обработке прерываний быстро записывать в него символы, а затем их уже можно выводить на экран медленными функциями типа printf(). В этом случае принимаемые данные не будут пропадать из-за того, что функция printf() не успевает их выводить. Конечно, ведь при поступлении очередного символа выполнение функции printf() прерывается и принятый символ записывается для дальнейшей обработки в буфер!
Мы рассмотрим коммуникационную программу, использующую прерывания от COM-порта в следующей главе, а теперь приведем модуль DISP.C:
Вспомогательный модуль TIMER.C содержит определения функций sleep() и delay(). Эти функции используются в программе для организации временных задержек, в частности при передаче модему Escape-последовательности «+++» для перевода его в командный режим.
Программа, представленная в предыдущей главе, имеет один большой недостаток: она должна постоянно производить опрос регистра состояния линии, с тем чтобы определить момент, когда от модема поступит очередной символ. В результате становится трудной, а иногда невозможной обработка поступающих символов. Например, если вы сразу отображаете символы, получаемые от COM-порта, на экране, то при использовании для этого функции putch() отдельные символы могут быть потеряны. Дело в том, что функция putch() работает слишком медленно и на скоростях 2400 бод и выше модем может успеть передать в COM-порт несколько новых символов, в то время как функция putch() еще не вывела на экран ни одного символа. В этом случае происходит ошибка переполнения входного буфера микросхемы UART (см. бит D2 регистра состояния линии).
Таким образом, имеет смысл организовать прием и передачу символов модему в фоновом режиме, используя прерывания по окончании приема и передачи символа.
Если ваша коммуникационная программа будет использовать прерывания, можно организовать буфер принимаемых и передаваемых данных. Обработчик прерываний должен проанализировать причину прерывания и либо передать в COM-порт очередной символ из буфера передатчика (если прерывание произошло в результате передачи очередного символа), либо считать поступивший символ из регистра данных и записать его в буфер приемника (если прерывание произошло в результате приема от модема очередного символа).
В этом случае процесс обмена идет в фоновом режиме и процессор может спокойно заниматься обработкой принимаемых и передаваемых символов. Если программе понадобится передать данные модему, она может просто записать их в буфер передатчика. Для приема данных она должна считать их из буфера приемника.
Принципы использования прерываний
Последовательный асинхронный адаптер можно запрограммировать таким образом, что всякий раз, когда он примет или передаст очередной байт, будет выработано соответствующее прерывание.
Вы можете отдельно запрещать или разрешать эти прерывания. Для этого необходимо установить соответствующие биты в регистре управления прерываниями.
Как приходит прерывание от COM-порта? Как мы указывали ранее, каждому COM-порту соответствует, кроме базового адреса его регистров, линия IRQ (см. главы «Последовательный асинхронный адаптер» и «COM-порт и номера IRQ»):
COM-порт | IRQ | Номер прерывания |
COM1 | IRQ4 | INT 0Ch |
COM2 | IRQ3 | INT 0Bh |
COM3 | IRQ4 | INT 0Ch |
COM4 | IRQ3 | INT 0Bh |
Заметим, что в данной таблице представлен только один возможный вариант соответствия номеру COM-порта линии IRQ. Некоторые платы асинхронных адаптеров и некоторые внутренние модемы имеют отдельно перемычки для выбора номера COM-порта (адреса базового регистра) и номера линии IRQ.
Что представляет из себя обработчик прерываний асинхронного адаптера? После вызова обработчика прерываний он должен:
Разрешить обработку прерываний
Необходимо выполнить команду sti, для того чтобы разрешить обработку прерываний с более высоким приоритетом, чем прерывание от асинхронного адаптера.
Определить причину прерывания
Для этого следует считать содержимое регистра идентификации прерываня. Состояние битов D1 D2 определяют причину прерывания:
Биты D2 D1 | Причина прерывания |
00 | прерывание по линии состояния; |
01 | буфер передатчика пуст; |
10 | данные приняты; |
11 | изменилось состояние модема. |
В зависимости от того, какое произошло прерывание, его надо соответствующим образом обработать.
Произошло прерывание по линии состояния
Считать регистр состояния линии и конкретизировать причину прерывания (данное прерывание сбрасывается после чтения регистра состояния линии). Если это необходимо, подать основной программе сигнал о произошедшей ошибке с целью ее устранения. Например, в случае определения на линии сигнала BREAK (удаленный модем повесил трубку), надо попытаться возобновить связь.
Прерывание по принятию данных
Очередной символ принят, и его можно считать через регистр данных. Прерывание сбрасывается после чтения регистра данных. Принятый байт необходимо записать в приемный буфер программы, из которого впоследствии его прочитает основная программа. Буфер приемника удобно организовать в виде очереди.
Буфер передатчика пуст
Прерывание происходит в случае, если буфер передатчика пуст и можно передать COM-порту очередной символ. Можно организовать буфер передатчика программы, в который программа будет записывать данные, предназначенные для передачи через COM-порт. В этом случае, когда придет прерывание, надо считать очередной символ из буфера передатчика программы и записать его в регистр данных. Прерывание сбрасывается после записи очередного символа в регистр данных UART. Если нет данных для передачи (программный буфер передатчика пуст), можно запретить это прерывание через регистр управления прерываниями.
Изменилось состояние модема
Прерывание происходит при изменении состояния входных линий CTS, RI, DCD, DSR. Состояние этих линий можно определить, считав регистр состояния модема. Это прерывание используется для обнаружения звонка на телефонной линии. Прерывание автоматически сбрасывается после чтения регистра состояния модема.
Считать регистр идентификации прерывания
Может случиться, что одновременно произойдет несколько прерываний. В этом случае бит D0 регистра идентификации прерываний равен единице. Тогда перед завершением обработки прерывания необходимо обработать следующее прерывание в соответствии с состоянием битов D1, D2. Так следует поступать до тех пор, пока не будут обработаны все прерывания (бит D0 не станет равен нулю).
Обработать конец прерывания
Передать контроллеру прерываний команду обработки конца прерывания. Для этого посылается в порт с адресом 20h команда конца прерывания:
Закончить обработку прерывания
Теперь можно закончить обработку прерывания, выполнив команду iret.
Итак, мы завершили рассмотрение обработчика прерываний. Теперь нам осталось изучить примерный порядок работы коммуникационной программы с использованием прерываний.
Установить обработчик прерываний
Необходимо установить обработчик прерываний, изменив соответствующий элемент таблицы векторов прерываний. Адрес старого обработчика сохраняется в глобальных переменных.
Инициализация COM-порта
Сначала надо перевести в неактивное состояние линии DTR и RTS. Затем сбросить регистр состояния линии, регистр состояния модема и регистр данных.
Последним шагом в инициализации регистров UART является установка регистра управления прерываниями, в который записывается соответствующее значение. Например, чтобы разрешить генерацию прерываний при приеме очередного символа, надо записать значение 01h в регистр управления прерываниями:
На этом этап инициализации регистров UART можно считать законченным. Теперь COM-порт подготовлен для обмена через него данными с модемом, но модем пока еще не будет воспринимать данные от компьютера. Чтобы перевести его в рабочее состояние, надо передать ему сигналы DTR и RTS. В ответ на эти сигналы модем должен вернуть компьютеру сигналы DSR и CTS.
Инициализация контроллера прерывний
Для того чтобы прерывания от асинхронного адаптера выполнялись, необходимо разрешить прерывание по соответствующей линии IRQ через регистр маски прерываний контроллера прерываний:
Инициализация модема и установление связи
После установки обработчика прерываний и инициализации регистров COM-порта и контроллера прерываний можно передавать модему AT-команды и принимать от него ответ на них. При этом данные можно считывать (записывать) из COM-порта через буфер обработчика прерываний.
Обмен данными с удаленным модемом
Установив связь с удаленным модемом, оба модема переходят в режим обмена данными. Теперь можно начинать передавать и принимать данные.
Передача и прием данных от удаленного модема осуществляются так же, как передача модему команд и прием от него сообщениий.
Завершение программы
Для завершения коммуникационной программы, использующей прерывания, необходимо сбросить сигналы DTR и RTS и запретить через контроллер прерываний прерывания от COM-порта:
Затем нужно восстановить старый вектор обработчика прерываний.
Коммуникационная программа CHAT
В этой главе мы приведем исходный текст коммуникационной программы CHAT. В отличие от программы CHAT_S данная программа использует для работы с асинхронным адаптером прерывания.
При помощи этой программы можно связаться с удаленным модемом, передавать и принимать от него данные в формате ASCII. Например, вы можете позвонить на станцию BBS и прочитать почтовые сообщения. Передачу и прием файлов программа не поддерживает, иначе пример занимал бы слишком много места.
Большинство параметров программы, таких, как AT-команды инициализации, телефонный номер, скорость обмена и номер COM-порта, можно настроить через файл конфигурации setup.cfg. Образец этого файла представлен ниже:
Программа состоит из следующих модулей:
После окончания связи вызывается функция shutdown(), которая опускает телефонную трубку и отключает обработчик прерываний.
Эти функции вызывают модули более низкого уровня: SEND_COMM.C, TOOLS.C.
Модуль CONF.C определяет функцию getconfig(), считывающую файл конфигурации setup.cfg и записывающую считанные значения в глобальные переменные.
Конфигурационный файл может содержать следующие команды:
Итак, исходный текст модуля CONF.C:
Модуль TOOLS.C содержит определения функций для работы с модулем UART.ASM.
Вспомогательный модуль TIMER.C содержит определения функций sleep() и delay(). Эти функции используются в программе для организации временных задержек.
Теперь мы приведем исходные тексты включаемых файлов, используемых нашей программой.
Как мы говорили ранее, одним из преимуществ внешнего модема над внутренним является наличие на его лицевой панели световых индикаторов, по которым можно определить состояние модема.
Мы приведем маленькую резидентную программу, которая отображает на экране дисплея состояние модема. Наша программа компенсирует недостаток внутреннего модема, связанный с отсутствием индикации.
Программу можно также использовать при отладке своих приложений, работающих с COM-портами, так как фактически она отображает состояние регистров микросхемы UART.
Как работает эта программа? Она перехватывает прерывание от таймера (с номером 1Сh) и таким образом получает управление несколько раз в секунду. Затем она считывает значения регистров состояния линии, состояния модема и регистра управления модемом.
После того как программа считает состояние регистров асинхронного порта, она отображает их состояние на экране дисплея. Вывод данных на экран наша программа выполняет путем непосредственного доступа к видеопамяти. При этом данные выводятся, начиная с адреса B800:0000. Если вы собираетесь использовать программу в графических режимах видеоадаптера или отображать данные о сотоянии регистров в другом месте экрана, то вам надо самим изменить процедуру вывода.
После запуска программы в левом верхнем углу экрана появится небольшое окно, в котором будет отображаться состояние линий TD, RD, RTS, CTS, RI, CDC, DTR, DSR:
Если какой-нибудь из этих сигналов примет значение логической единицы, то первый символ в названии этого сигнала будет отображаться с заглавной буквы. Например, если модем установил связь и передает данные, будут активными линии TD, RTS, CTS, DCD, DTR и DSR: