Cita:
Empezado por jfrancho
Buen día, necesito saber como enviar y recibir información por medio del puerto COM1 O rs232, en delphi 7.SALUDOS.-
|
Hola
Yo uso las API de Windows, si, se que es mas complicado pero te da mucha independencia y te permite hacer cualquier cosa con los puertos.
Yo lo hago así porque me dedico a la electrónica industrial y muchas veces me tuve que comunicar con dispositivos industriales como PLC's, controlodaroes de ejes, drives de motores, etc que cada uno tiene su propio protocolo, para que la vamos a hacer fácil si la podemos hacer dificil

.
Te mando el código que habitualmente uso, por hay te sirve-
Para abrir y configurar el puerto
Yo declaro previamente dos variables tipo
Esta es para leer el puerto, te devuelve Leido:=true si el puerto fue leido correctamente y en "Valor" el valor leido
Código Delphi
[-]type TComms = Record
Leido:boolean;
Valor:Integer;
End;
Esta es para abrir y configurar el puerto, te devuelve OK:=true si el puerto pudo ser abierto correctamente y en "Handle" un cardinal que apunta al puerto abierto, que luego se usa para las funciones de escritura/lectura;
Código Delphi
[-]type TAbrirPuertoCom = Record
Ok:boolean;
Handle:integer;
End;
Function Foem1.AbrirPuertoCom(FPuerto:PChar):TAbrirPuertoCom;
Var
Parametros:TDCB;
TimeOut:TCommTimeouts;
Baud,WordSize,Stops,Par:integer;
begin
result.Handle:=CreateFile(FPuerto, generic_read or generic_write ,0, nil, OPEN_EXISTING,0,0);
If result.handle=INVALID_HANDLE_VALUE then
Begin
MessageBox(0,'El puerto solicitado es inválido o está siendo usado por otro dispositivo',
'Atención',mb_ok+mb_SystemModal+mb_IconExclamation);
Result.Ok:=false;
OpenPort:=False;
exit;
end;
FillChar(Parametros, SizeOf(Parametros), 0);
With Parametros Do
Begin
DCBLength := SizeOf(DCB);
BaudRate:=9600; ByteSize:=8; Parity:=0; StopBits:=0; End;
With TimeOut do begin
ReadIntervalTimeout:=10;
ReadTotalTimeoutMultiplier:= 10;
ReadTotalTimeoutConstant:=10;
WriteTotalTimeoutMultiplier:=10;
WriteTotalTimeoutConstant:=10;
end;
if not (SetCommState(result.handle,Parametros)) or not (SetCommTimeouts(result.handle,TimeOut)) then
Begin
MessageBox(0,'Los parámetros de configuración del puerto son incorrectos',
'Atención',mb_ok+mb_SystemModal+mb_IconExclamation);
Result.Ok:=false;
Exit;
End;
Result.Ok:=True;
end;
Funcion para leer o escribir el puerto, normalmente para recibir información de algún dispositivo, primero hay que preguntarle, eso implica hacer primero una escritura, se hace enviando un array con la cantidad de caracteres y los caracteres que el dispositivo requiera
Código Delphi
[-]Function Form1.EscribirLeerRegistro(Puerto:Cardinal):TComms; Var k:longInt;
Preguntar: Array[0..19] of char;
Recibir: Array[0..19] of char;
CantBytes,ipCantBytes:cardinal;
OK:Boolean;
Begin
k:=0;
repeat
Begin
CantBytes:=20;
OK:=WriteFile(Puerto,textoLeer,CantBytes,ipCantBytes,nil); CantBytes:=20;
Ok:=ReadFile(Puerto,Recibir,CantBytes,ipCantBytes,nil); If ok Then
Begin
result.Valor:=Recibir; result.Leido:=true;
exit;
End;
End;
k:=k+1;
Until k>5; result.Leido:=false;
End;
Bueno espero no ser muy pesado


, pero esto te permite hacer lo que quieras inclusive, si te das maña, tu propio objeto de comunicaiones
Saludos
Augusto