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

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


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

Программа работает следующим образом: сначала устанавливает сигнал 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 ); }


Содержание раздела