#include #include #include #include #include /* Определение адресов регистров порта */ #define OUT_REG BASE /*Регистр передачи данных */ #define IN_REG BASE /*Регистр приема данных */ #define LOW_DIV BASE /*Младший байт делителя*/ #define HIGH_DIV BASE+1 /*Старший байт делителя*/ #define INT_REG BASE+1 /*Маска разрешеннах прерываний*/ #define INT_ID_REG BASE+2 /*Причина прерывания*/ #define CONTROL BASE+3 /*Управляющее слово УАПП*/ #define MODEM BASE+4 /*Ругистр управления статических сигналов*/ #define STATUS BASE+5 /*Состояние УАПП*/ #define M_STATUS BASE+6 /*Состояние статистических сигналов*/ /*********Определение основных констант ************/ /******Скорость передачи B_????? в бодах ******/ #define B_110 1040 #define B_150 768 #define B_300 384 #define B_600 192 #define B_1200 96 #define B_2400 48 #define B_4800 24 #define B_9600 12 /*должно быть 12, поправка на частоту БК /* /********Маски разрешенных прерываний **********/ #define DATA_REC 0x01 /*Данные приняты */ #define EMPTY_BUF 0x02 /*Буфер передачи пуст */ #define ERROR 0x04 /*Ошибка при приеме данных */ #define MODEM_INT 0x08 /*Изменилось состояние статистических сигналов*/ /*Управляющие константы*/ #define DIVISOR 0x80 /*Бит управления доступом к регистрам*/ #define BIT_8 0x03 /*Длина посылки 8 бит */ #define BIT_7 0x02 /*Длина посылки 7 бит */ #define STOP_1 0x00 /*1 стоповый бит */ #define STOP_2 0x04 /*2 стоповый бит */ #define NOPARITY 0x00 /*Нет контроля четности */ #define DTR 0x01 /*Управление линией DTR */ #define RTS 0x02 /*Управление линией RTS */ /*Маски готовности */ #define DATA_IN 0x01 /*Данные приняты */ #define OVERRUN 0x02 /*Переполнение */ #define FRAME_ERR 0x08 /*Ошибка формата посылки */ #define DATA_OUT 0x20 /*Готов к передаче */ /*Маски состояния статических сигналов */ #define CTS 0x10 /*Состояние линии CTS (приемник) */ #define DSR 0x20 /*Состояние линии DSR (передатчик) */ #define ESC 27 #define EOF (-1) int BASE=0x3F8; /*Базовый (первый) адрес блока регистров порт*/ int speed=12; /*Скорость передачи данных */ FILE *f1; /*Определение функций */ void init_port(void); int out_port(int symbol); int in_port(int *symbol); int error_code; int main(int argc,char *argv[]) { char name[]="Noname00.ext"; char ext[]=".ext"; int i,j,leng,adr,byte; /*РАЗБОР КОМАНДНОЙ СТРОКИ*/ if( argc==1 ) { printf("\nПрограмма записи в БК0010 через последовательный порт"); printf("\nКомандная строка:\n COP_BK %s /COM1 /9600 ",name); printf("\nПараметры с ключем / не обязательны,"); printf("\nпо умолчанию /COM1 /9600\n"); return(1); } /***РАЗБОР ИМЕНИ И РАСШИРЕНИЯ ФАЙЛА***/ strcpy(name,argv[1]); i=0; while( name[i] != '.' && name[i] != '\0' ) i++; if( name[i] == '\0') strcpy(ext,""); else { j=0; while( ext[j++]=name[i++] ); } /***РАЗБОР КЛЮЧЕЙ НАСТРОЙКИ ***/ if( argc > 2 && argc < 5 ) { i=2; do { if( argv[i][0] == '/') { if( stricmp( argv[i],"/COM1") == 0 ) BASE=0x3F8; else if( stricmp( argv[i],"/COM2") == 0 ) BASE=0x2F8; else { speed = 115200/atoi( &argv[i][1] ); if( speed == 0 ) { printf("\nНевернoe задание скорости "); exit(1); } } } else { printf("\nНеверный параметр "); exit(1); } } while( ++i < argc ); } else if( argc != 2 ) { printf("\nЛишний параметр "); exit(1); } /*****Открытие файла для передачи******/ f1 = fopen(name,"rb" ); if ( f1 == 0 ) { printf("\nНе могу открыть файл %s\n",name); return(3); } init_port(); /*****ОБРАБОТКА ФАЙЛА ПО РАСШИРЕНИЮ******/ if ( stricmp(ext,".pbk") == 0 ) { out_port( 0125 ); printf("\nПередан байт 0125n"); in_port( &byte ); printf("\nПринят байт %o\n",byte); if ( byte != 0125 ) { printf("\nОшибка при приеме-передаче\n" );fclose(f1); return(4); } /* передача адреса загрузки командного файла*/ byte=fgetc(f1); out_port(byte);adr=byte; byte=fgetc(f1); out_port(byte);adr=adr+byte*256; /* передача длины командного файла */ byte=fgetc(f1); out_port(byte);leng=byte; byte=fgetc(f1); out_port(byte);leng=leng+byte*256; } else { i=0; j=0; while( (byte=fgetc(f1)) != EOF ) { if( byte != 015 ) j++; i++; } fclose(f1); f1 = fopen(name,"rb" ); if ( f1 == 0 ) { printf("\nНе могу открыть файл %s\n",name); return(3); } if ( stricmp(ext,".tbk") == 0 ) leng=j; else leng=i; adr=0; /* передача адреса 0 загрузки не командного файла */ out_port(0); out_port(0); /* передача длины не командного файла */ byte=0377 & leng ; out_port(byte); byte=(0177400 & leng) >> 8; out_port(byte); } printf("Передается файл %s по адресу=%o длиной=%d\n",name,adr,leng); if ( stricmp(ext,".tbk") != 0 ) { /* передача не текстового массива */ printf("Передается не текстовый файл с расширением %s\n",ext); i=0; while( leng ) { byte=fgetc(f1); out_port(byte); printf("%o \r",--leng); } } else { /* передача текстового массива */ i=0; printf("Передается текстовый файл с расширением %s\n",ext); while( leng ) { byte=fgetc(f1); if( byte != 015 ) { out_port(byte); printf("%o \r",--leng); } } } fclose(f1); } /**********Инициализация порта***********/ void init_port(void) { outportb(CONTROL,DIVISOR); outportb(LOW_DIV,speed); outportb(HIGH_DIV,speed >> 8); outportb(CONTROL,BIT_8+STOP_1+NOPARITY); outportb(INT_REG,0); if ( ( inportb(STATUS) & DATA_IN) != 0) inportb(IN_REG); outportb(MODEM,0); } /*******ВЫДАЧА БАЙТА НА ПОРТ***********/ int out_port(int symbol) { long timeout; timeout=clock(); while( (inportb(M_STATUS) & CTS) == 0); do { if( (clock()-timeout) == 3) { printf("\nCвязь с БК-0010 не работает !!!\n"); return(1); } } while( (inportb(STATUS) & DATA_OUT) == 0); outportb(OUT_REG,symbol); return(0); } /**********ПРИЕМ БАЙТА ИЗ ПОРТА***********/ int in_port(int *symbol) { long tmp; tmp=clock(); outportb(MODEM,RTS); do { if((clock()-tmp)>= 10 ) { printf("\nПрием из БК не работает по времени\n"); return (1); } error_code=inportb(STATUS); } while (( error_code & DATA_IN) == 0 ); if(( error_code & (FRAME_ERR+OVERRUN))!=0) { printf("\nОшибка при приеме" ); return(2); } else { *symbol=inportb(IN_REG); outportb(MODEM,0); return(0); } }