Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование модемов

© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993, 236 стр.

[Назад] [Содеожание] [Дальше]

5.2. Простейшая программа работы с модемом

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

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

Отметим, что чтение кода возврата этой программой не выполняется, поэтому рано или поздно возникнет ошибка (переполнение буфера).

Приведем сначала исходный текст функций для управления линией DTR:

#include <stdio.h>

/**
*.Name         dtr_on
*
*.Title        Устанавливает сигнал DTR и RTS.
*
*.Descr        Эта функция устанавливает сигналы DTR и RTS
*              для заданного COM-порта.
*
*.Proto        void dtr_on( unsigned base_address );
*
*.Params       unsigned base_address - базовый адрес асинхронного адаптера
*
*.Return       не используется
*
*.Sample       dtr.c
**/

void dtr_on( unsigned base_address ) {

   unsigned char MCR;

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

   MCR = inp( base_address + 4 );

   // устанавливаем сигналы DTR и RTS в активное состояние

   MCR |= 3;

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

   outp( base_address + 4, MCR );
}




/**
*.Name         dtr_off
*
*.Title        Сбрасывает сигналы DTR и RTS.
*
*.Descr        Эта функция сбрасывает сигналы DTR и RTS
*              для заданного COM-порта.
*
*.Proto        void dtr_on( unsigned base_address );
*
*.Params       unsigned base_address - базовый адрес асинхронного адаптера
*
*.Return       не используется
*
*.Sample       dtr.c
**/

void dtr_off( unsigned base_address ) {

   unsigned char MCR;


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

   MCR = inp( base_address + 4 );

   // сбрасываем сигналы DTR и RTS

   MCR &= 0xFC;

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

   outp( base_address + 4, MCR );
}

Теперь приведем текст функции to_modem(), обеспечивающей передачу команд модему:

#include "sysp_com.h"

// объявления функций
void com_out( unsigned, char );
void to_modem( unsigned, char* );

/**
*.Name         to_modem
*
*.Title        Передает модему строку, оканчивающуюся нулем.
*
*.Proto        void to_modem( unsigned base_address, char *out_str );
*
*.Params       unsigned base_address - базовый адрес асинхронного адаптера,
*              на котором находится модем;
*
*              char *out_str - массив символов, передаваемый модему,
*              заканчивается нулем
*
*.Return       не используется
*
**/

void to_modem( unsigned base_address, char *out_str ) {

   int i;

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

   for( i = 0; out_str[i] != '\0'; i++ )
      com_out( base_address, out_str[i] );

   // заканчиваем передачу строки и посылаем модему код
   // возврата каретки, вызывающий исполнение введенной команды

   com_out( base_address, 13 );
}


/**
*.Name         com_out
*
*.Title        Передает модему один символ.
*
*.Descr        Эта функция передает один символ.
*
*.Proto        void com_out( unsigned base_address, char out_char )( unsigned base_address, char out_char );
*
*.Params       unsigned base_address - базовый адрес асинхронного адаптера,
*              на котором находится модем;
*
*              char out_char - символ, передаваемый модему,
*
*.Return       не используется
**/

void com_out( unsigned base_address, char out_char ) {

   unsigned char LCR, next;

   // ожидаем, пока освободится регистр передатчика
   // и можно будет передать следующий байт

   for( next = 0; next == 0; )
      next = 0x20 & inp( base_address + 5 );

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

   outp( base_address, out_char );
}

Теперь перейдем собственно к самой программе. Как вы можете видеть, она содержит всего несколько строк на Си:

//TEST.C

#include <conio.h>


unsigned  com_address( int );
void to_modem( unsigned, char* );
void dtr_on( unsigned );


void main(void) {

   unsigned com_adr;

   if(( com_adr = com_address( 1 )) < 0 ) exit( com_adr );

   // передаем модему сигнал DTR

   dtr_on( com_adr );

   // набираем телефонный номер

   to_modem( com_adr, "AT DP 411 64 17" );

   // ожидаем нажатия на любую клавишу

   getch();

   // сбрасываем сигнал DTR

   dtr_off( com_adr );
}
[Назад] [Содеожание] [Дальше]