PDA

Ver la Versión Completa : ayuda codigo para leer el puerto com1


happy-word
22-08-2008, 17:28:11
hola soy nuevo en el foro y tengo un problema con este codigo..

intento leer el puerto com1 desde delphi, tengo una central telefonica y nesecito leer el registro de llamadas, esto se hace atravez de un aparato llamado msdr6 el cual envia las llamadas parametrisadas al puerto y despues de ahy solo tengo que leer el puerto y recoger las llamas...


EL PROBLEMA ES: Que habeces las llamadas no llegan completas o llegan con caracteres de mas o suprime algunos...
no se si es porque estoy haciendo algo mal o me faltan comados....


esto mismo que hago desde delphi lo hace un programita que trae windows llamado hyperterminal que se encuentra en el menu de accesorios -- comunicacion. y este programa lo lee bien si suprimir caracteres ni nada... osea que ewl problema es de la aplicacion en delphi..

YAhora ustedes diran, por que no usas el hyperterminal.?.. RESPUESTA: porque el hypertelminal no me crea un archivo de texto automatico sino que ahy que detenerlo y crearlo manual.. y con el programa que cree en delphi puede automaticamente insertar los registros leidos a una base de datos oracle...




procedure TForm1.Timer1Timer(Sender: TObject);

var
Lectura: string;
dwValor: DWORD;
Sta: COMSTAT;
dd: Integer;
erro: string;
bResult: Boolean;
cad: string;

begin



if (ClearCommError(Puerto, dwValor, @Sta)) then
begin
// Mientras haya algo en el buffer de entrada...
while (0 < Sta.cbInQue) do
begin
// Redimensionar la variable de lectura
SetLength(Lectura, (Sta.cbInQue + 1));
// Leer del puerto
bResult := ReadFile(Puerto,
PChar(Lectura)^,
Sta.cbInQue,
dwValor,
nil);

cad:= cad + (lectura);
if (bResult) then
begin

// Aquí se almacenaría lo leído
MCaptura.Text :=MCaptura.Text + cad;


// Comprobar si hay algo más para leer
// y, si es así, continuar en el bucle
ClearCommError(Puerto, dwValor, @Sta);
end
else
begin
// Esto es un error de lectura.
// IMPORTANTE: si se produce un error nos
// quedamos en un bucle sinfín si no se hace:
Sta.cbInQue := 0;
MessageDlg('Error de lectura',mtError,mbOKCancel,0);
// También vale un 'break' o 'exit'
end;
end;
end;
end;




procedure TForm1.FormCreate(Sender: TObject);
begin

Puerto:=FileOpen('COM1' ,fmOpenRead);//Abre el puerto
Mode.BaudRate := 9600;
Mode.ByteSize := 8;
Mode.Parity := NOPARITY;
Mode.StopBits := ONESTOPBIT;
SetCommState(Puerto, Mode); //Ajusta los parámetros

Timer1.Enabled:=true;
end;


procedure TForm1.Timer2Timer(Sender: TObject);
var
llamada: string;
begin
if(MCaptura.Text<>'') then
begin


timer1.Enabled:=false;
FileClose(puerto);
SQLQuery1.SQL.Clear;
SQLQuery1.Close;
SQLQuery1.SQL.Add('insert into datos_central(cadena) values('''+mcaptura.Text+''')');
SQLQuery1.ExecSQL;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('commit');
SQLQuery1.ExecSQL;
MCaptura.Text:='';

Puerto:=FileOpen('COM1' ,fmOpenRead);//Abre el puerto
Mode.BaudRate := 9600;
Mode.ByteSize := 8;
Mode.Parity := NOPARITY;
Mode.StopBits := ONESTOPBIT;
SetCommState(Puerto, Mode); //Ajusta los parámetros


timer1.Enabled:=true;
end;
end;



este es el archivo capturado por el hyperterminal..

-------- 10/16/07 08:19:14 LINE = 0032 STN = 247
00:00:00 INCOMING CALL RINGING 0:03
00:00:42 HOLD
00:00:46 TRANSFERRED

-------- 10/16/07 08:20:00 LINE = 0032 STN = 221
00:00:00 FROM TRANSFER
00:00:00 UNHOLD
00:00:06 HOLD
00:00:18 TRANSFERRED

-------- 10/16/07 08:20:18 LINE = 0032 STN = 234
00:00:00 FROM TRANSFER
00:00:00 UNHOLD
00:04:07 CALL RELEASED

-------- 10/16/07 08:23:29 LINE = 0031 STN = 247
00:00:00 INCOMING CALL RINGING 0:03
00:00:21 HOLD
00:00:29 TRANSFERRED

-------- 10/16/07 08:23:58 LINE = 0031 STN = 230
00:00:00 FROM TRANSFER
00:00:00 UNHOLD
00:00:59 CALL RELEASED

-------- 10/16/07 08:20:34 LINE = 0051 STN = 249
00:00:00 OUTGOING CALL
DIGITS DIALED 8095912498
00:05:30 CALL RELEASED

-------- 10/16/07 08:28:07 LINE = 0050 STN = 234
00:00:00 OUTGOING CALL
00:00:03 CALL RELEASED

-------- 10/16/07 08:28:14 LINE = 0050 STN = 234
00:00:00 OUTGOING CALL
RESTRICTION PASSWORD 00
DIGITS DIALED 8099107862
00:00:12 CALL RELEASED

-------- 10/16/07 08:27:28 LINE = 0051 STN = 296
00:00:00 OUTGOING CALL
DIGITS DIALED 8095644392
00:00:55 CALL RELEASED

-------- 10/16/07 08:27:55 LINE = 0031 STN = 279
00:00:00 INCOMING CALL RINGING 0:03
00:00:23 HOLD
00:00:48 UNHOLD
00:01:01 CALL RELEASED

-------- 10/16/07 08:28:50 LINE = 0051 STN = 296
00:00:00 OUTGOING CALL
DIGITS DIALED 8095343394
00:00:40 CALL RELEASED

-------- 10/16/07 08:23:57 LINE = 0001 STN = 279
00:00:00 INCOMING CALL RINGING 0:03
00:00:19 HOLD
00:00:25 TRANSFERRED



un ejemplo de como esta recopilando la informacion del puerto con el programa en delphi..


L?&OT?
IU?U5UE???u-------- 08/22/08 10:06:29 LINE = 0019 STN = 245
00:00:00 OUTGOING CALL
DIGITS DIALED 809542
00:00:02 CALL RELEASED

-------- 08/22/08 10:06:33 LINE = 0021 STN = 245
00:00:00 OUTGOING CALL
DIGITS DIALED 8097845
00:00:03 CALL RELEASED


-------- 08/22/08 10:06:39 LINE = 0019 STN = 245
00:00:00 OUTGOING CALL
DIGITS DIALED 8097845
00:00:02 CALL RELEASED
A
-------- 08/22/08 10:07:28 LINE = 0021 STN = 245
00:00:00 -------- 08/22/08 10:07:28 LINE = 0021 STN = 245
00:00:00 NG CALL
DIGITS DIALED 8095461
00:00:03 CALL RELEASED
-------- 08/22/08 10:d2 LINE = 0021 STN = 245
00:00:00 OUTGOING CALL
DIGITS DIALED 8095
00:00:02 CALL RELEASED

egostar
22-08-2008, 17:41:44
Hola, bienvenido al foro,

Y.... ¿Cual es tu problema?

Salud OS