Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Enviar Y Recibir Informacion Puerto Com1 (https://www.clubdelphi.com/foros/showthread.php?t=78958)

jfrancho 30-05-2012 13:37:16

Enviar Y Recibir Informacion Puerto Com1
 
Buen día, necesito saber como enviar y recibir información por medio del puerto COM1 O rs232, en delphi 7.SALUDOS.-

Casimiro Noteví 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

Cita:

Empezado por jfrancho (Mensaje 433767)
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

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:D:D, pero esto te permite hacer lo que quieras inclusive, si te das maña, tu propio objeto de comunicaiones

Saludos
Augusto

Casimiro Noteví 30-05-2012 21:24:41

Recuerda poner los tags al código fuente, ejemplo:



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 Noteví 30-05-2012 21:49:05

Cita:

Empezado por ajvdelphi (Mensaje 433854)
Hola
Entendido, perdón no lo sabía, me pregunta justamente eso, porque quedaba muyyyyyyyy feo :D:D:D
Saludos
Augusto
:)

Aquí 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 :)


La franja horaria es GMT +2. Ahora son las 16:20:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi