Ver Mensaje Individual
  #3  
Antiguo 30-05-2012
ajvdelphi ajvdelphi is offline
Registrado
NULL
 
Registrado: may 2012
Posts: 7
Reputación: 0
ajvdelphi Va por buen camino
Cita:
Empezado por jfrancho Ver Mensaje
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; //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

Código Delphi [-]
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, pero esto te permite hacer lo que quieras inclusive, si te das maña, tu propio objeto de comunicaiones

Saludos
Augusto

Última edición por Casimiro Noteví fecha: 30-05-2012 a las 21:25:38.
Responder Con Cita