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

Коммуникационная программа


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

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

Итак, приступим. Как мы сказали ранее, первым шагом при программировании модема надо считать инициализацию COM-порта (микросхемы UART), к которому подключен модем.


if(mnp) printf("PageUp - режим вызова, PageDown - режим ответа\n\n");

_asm {

// устанавливаем скорость обмена и формат данных

xor ah,ah mov al,0A3h mov dx,com_port_num int 14h

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

mov ah,6 mov al,1 mov dx,com_port_num int 14h

// запрещаем использование режима управления потоком

mov ah,0Fh xor al,al mov dx,com_port_num int 14h }

// начинаем обмен данными между компьютером и модемом



do_chat(); }

void do_chat( void ) {

while(1) {

unsigned char key,stey; unsigned i,j;

// если пользователь нажал на клавиатуру, получаем код // нажатого символа и передаем его модему

if( kbhit() ) { key = getch();

if(( key == 0 ) && mnp) { key = getch(); if( key == 73 ) origin(); else if( key == 81 ) answer(); continue; }

// по нажатию клавиши Esc выходим из программы

if( key == 27 ) {

_asm {

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

mov ah,06h xor al,al mov dx,com_port_num int 14h

// деинициализируем FOSSIL драйвер

mov ah,05h mov dx,com_port_num int 14h }

return; }

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

if( key == '\r' ) { key = 13; putch('\n'); }

// выводим ASCII код нажатого на клавиатуре символа // на экран

putch(key);

// передаем ASCII код нажатого на клавиатуре символа // FOSSIL драйверу, для дальнейшей передачи его модему

_asm { mov dx,com_port_num mov ah,1 mov al,key int 14h } }

// определяем состояние приемного буфера FOSSIL драйвера

_asm { mov dx,com_port_num mov ah,3 int 14h and ah,01h mov stey,ah }

// если приемный буфер содержит данные, выводим их // на экран дисплея

if( stey > 0 ) { _asm { mov dx,com_port_num mov ah,2 int 14h mov stey,al } putch(stey); } } }

void help( void ) {

printf("Неправильно задан параметр программы \n" "FOSSILEX n, где n - номер порта от 0 до 3\n"); exit(0); }

void origin(void) {

// переключаем эмулятор MNP в режим вызова удаленного модема

_asm { mov ah,0E0h mov al, 2 mov bl,0 mov bh,1 mov dx,com_port_num int 14h } putch(7); }

void answer(void){

// переключаем эмулятор MNP в режим ответа на // вызов удаленного модема

_asm { mov ah,0E0h mov al,2 mov bl,1 mov bh,1 mov dx,com_port_num int 14h } putch(7); putch(7); }


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