Несомненно, его применение на объектах хозяйствования даст положительный эффект в улучшении информативности в системе МЧС, а следовательно и повышении пожарной безопасности. Массовое внедрение системы в жилых домах, квартирах, дачах, общежитиях, гостиницах, промышленных предприятиях и других помещениях с постоянным проживанием людей и пребыванием персонала позволит существенно сократить число погибающих (уменьшение времени обнаружения, прибытия), а в сочетании с комплексом других профилактических мер либо исключить их, либо свести к минимуму.
ПРИЛОЖЕНИЕ 1
// ======================================================================
// = Базовая программа работы с последовательным портом COMi.
// = Обмен с использованием прерываний
// ======================================================================
#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <process.h>
#define COM 2 // задается номер порта 1-COMi; 2-COM2
// дальнейший код справедлив для машин класса AT
#define INTRS 13-COM
#define m_speed 2 // множитель задает скорость передачи
// 1-9600
// 2-19200 и т.д.
// 6-57600
// 12-115200
#define cbuf 2000 // размер буфера данных
#ifdef cplusplus
#define CPPARGS .
#else
#define CPPARGS
#endif
#define rgmask 16/COM //маска в регистре маски прерываний
#define byte_sync 33
#define byte_pream 85
int IMR=0x21; // регистр маски прерываний
int base,IER,IIR,LCR,LSR,MSR,MCR,LSB,MSB; // регистры контроллера
// последовательного интерфейса
char fl_d=0; // флаг устанавливается если принят байт
// если=0 то буфер пуст
char overb=0; // флаг устанавливается если буфер переполнен
char area[cbuf]; // буфер данных
int head=0,teil=0; // указатели головы и хвоста
char count0=0; // help count
char exiterr=0; //номер ошибки при приеме
// exiterr=0 - ошибок нет
// exiterr=1 - ошибка приема
// exiterr=2 - ошибка по тайм-ауту
// exiterr=3 - cбой в приеме: передано неверное
//число байт
// exiterr=4 - сбой при приeмe или переполнение
//буфера
char errcode=0; // код ошибки
void interrupt obrcom( CPPARGS); /* interrupt prototype */
void interrupt (*oldfunc)( CPPARGS); /* interrupt function pointer */
void nevid(void); //делает курсор невидимым
void initrs(void); //инициализация COM порта
void init(void); //инициализация переменных
void exitp(void); //!!! необходимо вызывать перед выходом из программы
int trans(char); //передача байта через СОМ порт
void deside(void); //обработка данных
void signal(void); //звуковой сигнал
void outinfo(void); //вывод информации на экран
void reseterr(void); //сброс ошибок RS232
void instvect(void); //Замена вектора прерываний COMi
void restorevect(void); //Восстановление старого обработчика C
void incteil(void); //Увеличение указателя хвоста
void err(char *); //Выход по ошибке
void Transb(char); // посылка байта с сервисом
int Transb_hiden(char); // Не выдает сообщения об ошибках
void clearbof(void); // очистка буфера данных
void definit(void); // определяет работоспособность с той стороны
void clearbofkey(void); // очистка буфера клавиатуры
void pusk(void);
struct k_win // координаты окна
{ int x0,y0,x1,y1,lastx,lasty; } wmain,wmes;
//=======================
void nevid(void) //невидимый курсор
{ asm{ push cx
push ax
mov ah,01
mov ch,20H
mov cl,0
int 10H
pop ax
pop cx
}
}
// =========== инициализация переменных ====================
void init(void)
{ int i;
wmain.x0=1; wmain.y0=1; wmain.x1=80; wmain.y1=16;
wmes.x0=1; wmes.y0=wmain.y1+2; wmes.x1=80; wmes.y1=25;
wmain.lastx=wmain.lasty=wmes.lastx=wmes.lasty=1;
exiterr=0;
}
//============ инициализация последовательного порта ===========
void initrs(void)
{
asm { push es
push bx
mov bx,COM
dec bx
shl bx,1
mov ax,40H //вычислить базовый адрес
mov es,ax
mov dx,es:[bx]
mov base,dx
pop bx
pop es
}
IER=base+1; IIR=base+2; LCR=base+3; MCR=base+4; LSR=base+5;
MSR=base+6; LSB=base; MSB=base+1;
disable();
instvect(); // установить обработчик
outportb(IMR,(inportb(IMR)&(255-rgmask))); // разрешить прерывание
outportb(IER,5); //разрешить прерывания по доступности данных и по ошибке
outportb(LCR,(inportb(LCR)|0x80)); // доступ к делителю частоты
outportb(LSB,12/m_speed); // 1843200/(x*16)=y бит/c
outportb(MSB,0);
outportb(LCR,27); // установить параметры :
// длина слова обмена 8 бит + контроль четности + DLAB=0
outportb(MCR,(8)); // ;rts=0 ;dtr=0
// сбросить условия возникновения прерываний
//outportb(base,0);
inportb(base);
inportb(MSR);
inportb(LSR);
enable();
}
//=========== звуковой сигнал ==================
void signal(void)
{ sound(700); delay(200); nosound();
}
// чтение LSR - сброс ошибок
void reseterr(void)
{
inportb(LSR);
}
char foi=0;
// ================= передача байта 'dm' в канал связи ==========
int trans(char dm)
{
inlsr:
asm {
mov dx,base
add dx,5
in al,dx //прочитать LSR
test al,00011110B // ошибка ?
jnz toer
test al,1
jnz indata
test al,32 // Передатчик освобожден ?
jz inlsr
sub dx,5
mov al,dm
out dx,al
}
return 0;
toer: reseterr(); return -1;
indata: return 1;
}
void instvect(void) // замена вектора прерывания
{
oldfunc = _dos_getvect(INTRS);
_dos_setvect(INTRS,obrcom);
}
// восстановление старого вектора
void restorevect(void)
{ /* restore to original interrupt routine */
_dos_setvect(INTRS,oldfunc);
}
char d;
//=========== прием данных не используя прерываний =============
int priem(void)
{ char clt; int i=0;
do { clt=inportb(LSR);
if ((clt&30)!=0) { errcode=clt; reseterr(); return -1; }
// байт принят ?
if (clt&1) { d=inportb(base); return 0; }
i++;
}
while (i!=0);
return 1;
}
// новый обработчик прерывания от COMi
void interrupt obrcom( CPPARGS)
{ char p;
p=((inportb(IIR)>>1)&3);
switch (p) // определить тип прерывания
{ case 0: // изменение линии состояния устройства с той стороны
inportb(MSR); break;
case 1: // прерывание от передатчика
break;
case 3: // по ошибке
errcode=inportb(LSR); inportb(base); break;
case 2: // доступность данных
{ area[head++]=inportb(base); //записать байт в буфер
if (head==cbuf) head=0;
if (head==teil) overb=1; // отметить если голова догнала
// хвост