Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2006
bill_mg bill_mg is offline
Miembro
 
Registrado: may 2006
Posts: 10
Poder: 0
bill_mg Va por buen camino
Escribir datos en el puerto serial en windows XP

Buenas tardes, como puedo escribir un dato en el puerto serial de XP utilizando delphi 6.0, tengo un circuito electrónico que se conecta al puerto serial de la computadora y al recibir el número "1" como dato de entrada genera un pulso de corriente electrica para abrir una puerta.
Responder Con Cita
  #2  
Antiguo 08-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Si solo quieres mandar un byte puede que esta funcion te resulte util:
Código Delphi [-]
function MandarByte(Puerto: String; B: Byte): Boolean;
var
  hPort: THandle;
  DCB: TDCB;
  Escritos: Cardinal;
begin
  Result:= FALSE;
  Puerto:= Uppercase(Puerto);
  // Cambiar esto si es necesario un puerto diferente
  if (Puerto<>'COM1') and (Puerto<>'COM2') then
    exit;
  hPort:= CreateFile(PChar('\\.\'+Puerto), GENERIC_READ or GENERIC_WRITE,0, nil,
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hPort<>INVALID_HANDLE_VALUE then
  begin
    DCB.DCBlength:= sizeof(DCB);
    if GetCommState(hPort,DCB) then
    begin
      // Cambiar esto para una configuracion del puerto diferente
      with DCB do
      begin
        BaudRate := CBR_9600;
        ByteSize := 8;
        Parity   := NOPARITY;
        StopBits := ONESTOPBIT;
        Flags    := $01;
      end;
      if SetCommState(hPort, DCB) then
      begin
        PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or
          PURGE_RXCLEAR);
        Result := WriteFile(hPort, B, 1, Escritos, nil);
      end;
    end;
    CloseHandle(hPort);
  end;
end;

Para usarla, por ejemplo, para mandar un 1:
Código Delphi [-]
  MandarByte('COM1',1);

Como sugerencia: Puedes usar los pines DTR y RTS para mandar señales sin necesidad de un circuito muy complicado, pero si ya tienes el circuito montado, da lo mismo.
Responder Con Cita
  #3  
Antiguo 08-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Seoane, disculpa que me meta en el código de la función que has escrito: no soy yo quién, pero, en fin. Me llamó la atención que la variable "Escritos" no se inicializa en ningún momento. Lo mismo da exactamente igual, pero, como me llamó la atención... ahí queda dicho, por si acaso.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 08-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
La variable "Escritos" se pasa por referencia a la funcion, es la propia funcion la que le asigna un valor. No hay necesidad de inicializarla.
Responder Con Cita
  #5  
Antiguo 08-07-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno, es lo que yo decía, ¿no?
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 08-07-2006
bill_mg bill_mg is offline
Miembro
 
Registrado: may 2006
Posts: 10
Poder: 0
bill_mg Va por buen camino
cambiar la configuracion del flags

Amigo antetodo muchas gracias por la fuente, el codigo compila sin errores pero el circuito no recibe el dato.

Realicé pruebas en hyperterminal fijando la configuración del puerto en 9600 Bits por seg, 8 Bits de datos, paridad: ninguna, 1 Bits de parada y en control de flujo: ninguno, y funciona...

Ahora voy a la configuración de la fuente que enviaste que es la siguiente:
BaudRate := CBR_9600;
ByteSize := 8;
Parity := NOPARITY;
StopBits := ONESTOPBIT;
Flags := $01; Aqui en el Flags, es donde debo especificar la opcion NINGUNO, ya probe con $00, $02, $03 y nada. CUAL SERA EL PARAMETRO???

Ahhhh, me cambiaron el parametro 1 por A es decir, tu me enviaste la función MandarByte('COM1',1); pero debo cambiarla a MandarByte('COM1','A'); te lo comento por si tiene algo que ver, y porsupueto cambien el BYTE por STRING en el parametro B

Última edición por bill_mg fecha: 08-07-2006 a las 17:57:07.
Responder Con Cita
  #7  
Antiguo 08-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Para mandar el carácter 'A' (ASCII 65) no hace falta que cambies nada en la función, dejándola tal cual estaba antes utiliza esto:

Código Delphi [-]
  MandarByte('COM1',Ord('A'));

Si cambias el tipo de parámetro de Byte por un string y dejas el resto de la función igual, no estas mandando un 'A' si no otra cosa. Mejor utiliza el método que te explico arriba.
Responder Con Cita
  #8  
Antiguo 09-07-2006
bill_mg bill_mg is offline
Miembro
 
Registrado: may 2006
Posts: 10
Poder: 0
bill_mg Va por buen camino
no lee el dato

El código corre y no genera error pero no manda el dato. Para que sirve la variable Escritos, el valor de esta en la linea donde aparece
Result := WriteFile(hPort, B, 1, Escritos, nil); es un poco de numeros algo así como 1489274260 porque crees que no manda el dato. Pruebo el circuito con hyperterminal y funciona bien. Que puede estar pasando?
Responder Con Cita
  #9  
Antiguo 09-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Supongo que como te aconseje mas arriba volviste a dejar el código de la función como estaba, y utilizas la función Ord para convertir un carácter en un Byte. Si no es así corrígeme. Si estas haciendo esto, no se porque no te funciona, solo puedo adivinar.

Comprueba lo siguiente:
- No es lo mismo una 'A' que una 'a'
- Que el circuito no necesite de alguna señal en los pines DTR y RTS
- Comprueba que otro programa no esta usando el puerto serie
- Comprueba que el puerto es el correcto
- Comprueba los parámetros del puerto serie

En cuanto a la variable "Escritos" no le deis mas vueltas, solo la incluyo porque es necesaria para llamar a la función pero su valor antes de llamar a la función no es importante, en cambio su valor después de la función no indica el numero de bytes que realmente se han escrito. Tienes que pensar que esta misma función se utiliza para escribir en muchos lugares (ficheros, discos, pipes, sockets, etc) y en algunos tiene sentido que no se puedan escribir todos los bytes que se quiera, en esos caso la variable nos devuelve el numero de bytes que han sido escritos realmente. En este caso no tiene mucho sentido, solo mando escribir un byte y el puerto serie no tiene porque rehusar mandarlo así que tampoco compruebo su valor después de llamar a la función WriteFile, es una variable inútil en este caso.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como recibir datos en un puerto serial JULIPO PHP 1 17-06-2006 20:54:36
Capturar Ventana Windows y escribir datos nachoporcar API de Windows 2 01-06-2006 19:57:31
Puerto serial CLX bismarck_sierra Lazarus, FreePascal, Kylix, etc. 0 06-07-2004 21:55:22
Puerto serial fled Varios 2 28-04-2004 22:27:47
Puerto serial. danytorres Impresión 1 29-01-2004 16:51:42


La franja horaria es GMT +2. Ahora son las 15:43:31.


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