Показать сообщение отдельно
  #5  
Старый 30.06.2008, 10:51
Raam Raam вне форума
Прохожий
 
Регистрация: 19.05.2008
Сообщения: 3
Репутация: 10
По умолчанию

//класс для порта
TComPort = class
constructor createC(NameP:string);
destructor destroyC;
private
InBuffer : array[0..1023] of Char;
dcb:Tdcb; //настройка порта
ct: TCommTimeouts; //настройка времени
Panswer:string;
procedure analaize(rezT:string);
public
ComPort:THandle;
property answer:string read Panswer write analaize;
Procedure WritePort(commandT:string);
Procedure ReadPort;
end;

var
comThread:TcomThread;

implementation
uses UMain,Uanaliz;

//запуск потока
procedure TcomThread.Execute;
begin
Repeat
Port.ReadPort;
Until Terminated;
end;


//*************Описание класса для компорта*******
//создание порта и запуск потока
constructor Tcomport.CreateC(NameP:string);
begin
ComPort:= CreateFile(PChar(NameP),GENERIC_WRITE+GENERIC_READ ,
0,nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,0);
if ComPort = INVALID_HANDLE_VALUE then showmessage ('Устройтсво не обнаружено');
Windows.SetupComm(ComPort, 2048, 2048);// then showmessage('');
GetCommState(ComPort, dcb);
with dcb do
begin
BaudRate := 9600;
ByteSize := 8;
Parity := NOPARITY;
StopBits := ONESTOPBIT; // одиночный стоп-бит
Flags := EV_RXCHAR + EV_EVENT2;
end;
setCommState(ComPort, dcb); //смена настроек порта

with ct do
begin
ReadTotalTimeoutConstant := 50;
ReadIntervalTimeout := 50;
ReadTotalTimeoutMultiplier := 1;
WriteTotalTimeoutMultiplier := 0;
WriteTotalTimeoutConstant := 10;
end;
SetCommTimeouts(comport, ct); //смена таймингов
//запуск потока на чтение
comThread := TcomThread.Create(false);
//************
end;

//деструктор (Обрывает поток и закрывает порт)
destructor Tcomport.destroyC;
begin
comThread.Terminate;
CloseHandle(ComPort);//закрыть файл
end;


//запись в порт
Procedure Tcomport.WritePort(commandT:string);
var NumberWritten:cardinal;commandP:string;
begin
NumberWritten:=0;
commandP:=commandT + #13 + #10;
if WriteFile(Comport,PChar(commandP)^,
Length(commandP),NumberWritten, nil) = false then
ShowMessage('Unable to write to ' + POrtname);
//отчистить буфер
PurgeComm(Comport, PURGE_TXCLEAR + PURGE_RXCLEAR);
end;

//Чтение из порта
procedure TComPort.ReadPort;
var BytesRead:cardinal; tempAnswer:String;i:integer;
begin
if ReadFile(Comport,InBuffer,SizeOf(InBuffer),BytesRe ad,nil) then
begin
for i:=0 to (BytesRead-1) do tempAnswer:=tempAnswer+InBuffer[i]; end;

//Очистка пота
PurgeComm(Comport, PURGE_TXCLEAR + PURGE_RXCLEAR);
if BytesRead<>0 then answer := Trim(tempAnswer); //trim - убирает слева и справа все пробелы
end;

//функция анализа
procedure TcomPort.analaize(rezT:string);
var i:integer;l:string;//l для отладки
begin
Panswer:=rezT;
//временно
for i:=1 to length(answer) do l:=l+inttostr(i);
FMain.Memo1.Lines.Add(l);
FMain.Memo1.Lines.Add(answer);
//********
if answer='RING' then DMAnalize.AnalaizeCall;
if copy(answer,1,11) = '+CMTI: "MT"' then DMAnalize.AnalaizeSMS(answer);
end;


ВОТ ТУТ ПРОБЛЕМА: КАК В ФУНКЦИЮ DMAnalize.AnalaizeCall ПЕРЕДАТЬ ИМЯ ОБЪЕКТА, А ИХ 2:PORT И PORT_S, ЧТОБЫ ИЗБЕЖАТЬ СЛЕДУЮЩЕГО:

1. дАННАЯ ФУНКЦИЯ РАБОТАТЕТ ТОЛЬКО С PORT, А Я ХОЧУ ЧТОБЫ ОНА РАБОТАЛА C ТЕМ ПОРТОМ - ИМЯ КОТОРОГО ЕЙ ПЕРЕДАТЬ (AnalaizeCall(poRT_:tCOMPORT)) - Я НЕ МОГУ ПЕРЕДАТЬ ИМЯ В ФУНКЦИЮ - БОНАЛЬНО НАМЕ ГОВОРИТ ЧТО РАЗНЫЕ ТИПЫ


procedure TDMAnalize.AnalaizeCall;
var mesag:string;
begin
comThread.Terminate;//1.оставноить поток на считывание
Port.WritePort('AT+clcc');//определение номера
Port.ReadPort;
//поиск номера в базе
phonenumber:=copy(POrt.answer,21,10);

with ADOQnamber do
begin
SQL.Text:='select * from abonent where TelephoneE="'+phonenumber+'"';
Active:=true;

if RecordCount <> 1 {отсутствует в базе}
then begin
POrt.WritePort('ATH');
//Umain.GridColor:='Y'; выделение цветтом различных групп событий
mesag:='Попытка несанкционированного доступа (ЗВОНОК) от номера 8'+ phonenumber;

end else begin
POrt.WritePort('ATA'); sleep(1000);{длительность звонка}
POrt.WritePort('ATH');
mesag:='Сработка сигнализации по адресу '+ ADOQnamber.FieldByName('Adress').AsString;
TimeAlarm:=(DateToStr(date)+' '+TimeToStr(Time));//глобальная памаять на последнюю сработку
Timer.Enabled:=true
end;
end;
comThread := TcomThread.Create(false); //запуск потока на считывания
with ADOQEvents do //запись сообщения
begin
Active:=true;
Insert;
FieldByName('EvPhonenumber').AsString:=phonenumber ;
FieldByName('Message').AsString:='Call';
FieldByName('date').AsDateTime:=StrToDateTime(Date ToStr(date)+' '+TimeToStr(Time));
Post;
Active:=false;
end;

ADOQnamber.Active:=false;
with Fmain.SGINF do
begin
Cells[0,Fmain.SGINF.RowCount-1]:=TimeToStr(Time)+' '+DateToStr(date);
Cells[1,Fmain.SGINF.RowCount-1]:=mesag+' ЗВОНОК';
RowCount:=Fmain.SGINF.RowCount+1;
Perform(WM_VScroll,SB_LINEDOWN,0);
end;
Ответить с цитированием