PDA

Ver la Versión Completa : Enviar Y Recibir Informacion Puerto Com1


jfrancho
30-05-2012, 13:37:16
Buen día, necesito saber como enviar y recibir información por medio del puerto COM1 O rs232, en delphi 7.SALUDOS.-

Casimiro Notevi
30-05-2012, 14:01:36
Mira si te sirve algunos de los enlaces del final de esta página, abajo del todo.

ajvdelphi
30-05-2012, 21:11:22
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 :mad:.

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

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;

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; //Velocidad de transmision
ByteSize:=8; //Bits de datos
Parity:=0; //paridad 0=none 1=Par 2=impar
StopBits:=0; //bits de parada 1 Bit=0, 2 bits=1
End;
With TimeOut do //Configura el timeout del puerto en ms
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

Function Form1.EscribirLeerRegistro(Puerto:Cardinal):TComms; //Puerto es el valor(handle) que nos devolvió la función de AbrirPuertoCom
Var k:longInt;
Preguntar: Array[0..19] of char;
Recibir: Array[0..19] of char;
CantBytes,ipCantBytes:cardinal;
OK:Boolean;
Begin
//Llenar el array para preguntar
{Preguntar[0]:= 'A';
..............
Preguntar[19]:=CHar(13);}
k:=0;
repeat
Begin
CantBytes:=20;
OK:=WriteFile(Puerto,textoLeer,CantBytes,ipCantBytes,nil); //Escribe
CantBytes:=20;
Ok:=ReadFile(Puerto,Recibir,CantBytes,ipCantBytes,nil); //Lee
If ok Then
Begin
result.Valor:=Recibir; // Aquí en realidad hay que hacer lo que uno precise. La función ReadFile devuelve un array de
// caracteres, habrá que convertirlos a algún valor si se desea o devolverlos como caracteres.
//En este caso result.valor es un integer, pero podría ser un array u otro tipo de variable
result.Leido:=true;
exit;
End;
End;
k:=k+1;
Until k>5; //cantidad de interrogaciones si Ok viene false
result.Leido:=false;
End;

Bueno espero no ser muy pesado:D:D, pero esto te permite hacer lo que quieras inclusive, si te das maña, tu propio objeto de comunicaiones

Saludos
Augusto

Casimiro Notevi
30-05-2012, 21:24:41
Recuerda poner los tags al código fuente, ejemplo:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

ajvdelphi
30-05-2012, 21:40:59
Hola

Entendido, perdón no lo sabía, me pregunta justamente eso, porque quedaba muyyyyyyyy feo :D:D:D

Saludos
Augusto
:)

Casimiro Notevi
30-05-2012, 21:49:05
Hola
Entendido, perdón no lo sabía, me pregunta justamente eso, porque quedaba muyyyyyyyy feo :D:D:D
Saludos
Augusto
:)

Aquí (http://www.clubdelphi.com/foros/misc.php?do=bbcode) tienes una guía de todos los 'tags', puedes guardarte el enlace para usarlo en cualquier otra ocasión que lo necesites,
aunque normalmente te vale con los que te he mostrado anteriormente :)


Por cierto, gracias por la aportación, me guardo el código, lo mismo me hace falta algún día :)