Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-08-2006
Dalmine Dalmine is offline
No confirmado
 
Registrado: ago 2006
Ubicación: Argentina Campana Buenos Aires
Posts: 19
Poder: 0
Dalmine Va por buen camino
APrender sobre puertos seriales y paralelo

Hola quisiera saber si hay info como para exmpezar a ver como se usan las comunicaciones entre delphi y los puertos, para enviar senales y realizar x tareas.
Gracias!!
Responder Con Cita
  #2  
Antiguo 25-08-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
Hola Dalmie,

ya respondí a tu pregunta en el truco 355. En cuanto a lo de usar los puertos, si estamos hablando de Windows XP/2000 o posteriores la cosa esta complicada, ya que no esta permitido acceder a ellos de forma directa. En el caso del puerto serie, como ya comprobaste, se pueden usar las lineas RTS y DTR para mandar señales con la función EscapeCommFunction. Y también hay funciones para realizar una transmisión serie, hasta ahí no hay problema. La cosa se complica si lo que queremos es utilizar los pines del puerto a nuestro antojo tanto del puerto serie como del paralelo, entonces necesitaremos de algún tipo de driver que tendremos que instalar. Busca por internet, hay varios drivers gratuitos que podrás utilizar.
Responder Con Cita
  #3  
Antiguo 04-09-2006
vanessa_pedraza vanessa_pedraza is offline
Registrado
 
Registrado: sep 2006
Posts: 1
Poder: 0
vanessa_pedraza Va por buen camino
Smile Yo Lo He Hecho Con El Lenguaje C

Hola. Yo Tambien Estoy Tratando De Aprender A Activar Los Pines De Datos Del Puerto Paralelo. Lo Que Yo Quiero Es Activar Y Desactivar Aparatos Electrónicos O Electrodomésticos Mediante El Encendido O Apagado De Uno De Estos Pines, Y Por Medio De Una Placa Electrònica Y Un Relé... Si Ya Aprendiste Algo, Por Favor Pasalo No? Podemos Aprender Muchos Ambos. Tengo Un Proyecto Muy Bueno Con Esto... Amigos?
Responder Con Cita
  #4  
Antiguo 04-09-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
Hola Vanessa, no se si le echaste ya un vistazo al truco 355, se utiliza el puerto serie y no el paralelo, pero aun así se pueden manejar hasta dos relés. La ventaja es que no es necesario ningún tipo de driver para acceder al puerto serie, mientras que para acceder al puerto paralelo si es necesario.
Responder Con Cita
  #5  
Antiguo 04-09-2006
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por Dalmine
Hola quisiera saber si hay info como para exmpezar a ver como se usan las comunicaciones entre delphi y los puertos, para enviar senales y realizar x tareas.
Gracias!!
Para el uso del puerto paralelo, se pueden implementar las siguientes rutinas, de escritura y lectura:

Código:
procedure OutPort(PortAddress:smallint;Value:smallint);
var
   ByteValue:Byte;
begin
     ByteValue:=Byte(Value);
     asm
        mov dx,PortAddress
        mov al, ByteValue
        out dx,al
     end;
end;
function InPort(PortAddress:smallint):smallint;
var
   ByteValue:byte;
begin
   asm
        mov dx, PortAddress
        in al,dx
        mov ByteValue,al
        end;
    Inp32:=smallint(ByteValue) and $00FF;
end;
Pero, estas rutinas asi como estan no funcionarian en sistemas operativos basados en NT, como es el caso de Windows XP, ya que son funciones de privilegio que no estan asignadas por defecto a ningun perfil de usuario, ni siquiera Administrador. Para solucionar este problema, nos remitimos al Assembler, agregando 2 funciones elementales para el manejo de la pila, Push y Pop (empujar y sacar, para ser sencillo), quedando corregido el código, como:

Código:
procedure OutPort(direccion:smallint;dato:smallint);
var
   ByteDato:Byte;
begin
     ByteDato:=Byte(dato);
     asm
        push dx
        mov dx,direccion
        mov al, ByteDato
        out dx,al
        pop dx
     end;
end;
function InPort(direccion:smallint):smallint;
var
   ByteDato:byte;
begin
   asm
        push dx
        mov dx, direccion
        in al,dx
        mov ByteDato,al
        pop dx
    end;
    InpPort:=smallint(ByteDato) and $00FF;
end;
Con estos arreglos en el Assembler de tan solo 2 lineas de código, ya puedes utilizarlo bajo windows XP, obviamente incluyendo las salvedades pertinentes para el manejo de recursos, como en el caso de "impou32.dll" que puedes descargar de internet. El ejemplo de llamada a estas funciones, es realmente muy sencillo:

Escritura en el Puerto Paralelo - BUS de DATOS($378) y BUS CONTROL ($37A)
Código:
OutPort($378,50);
//enviamos 50 al puerto 378 de nuestro LPT
Lectura del Puerto Paralelo - BUS de ESTADO ($379)
Código:
mi_variable:=InPort($379);
//leemos el valor de nuestro LPT
Aqui te dejo el Source de la DLL "inpout32.dll" para que lo tengas en cuenta y agreges y/o realices los cambios que creas necesarios. Como dato, no es poca cosa, ya que es vital para quienes programamos software para dispositivos electronicos. La fuente y toda la info acerca de este control y algunos otros muy utiles los encontras en : http://www.logix4u.net/inpout32.htm, vale la pena leerlos. Es muy util crear una DLL para el manejo de todos los puertos del PC, e ir de vez en cuando actualizando algunos pormenores

INPOUT32.DLL - OPEN SOURCE

Código:
{Source code for inpout32.dll.
Enables 32-bit Visual Basic programs to do direct port I/O
(Inp and Out) under Windows 95.
To be compiled with Borland's Delphi 2.0.}
library inpout32;
uses SysUtils;
procedure Out32(PortAddress:smallint;Value:smallint);stdcall;export;
var
   ByteValue:Byte;
begin
     ByteValue:=Byte(Value);
     asm
        push dx
        mov dx,PortAddress
        mov al, ByteValue
        out dx,al
        pop dx
     end;
end;

function Inp32(PortAddress:smallint):smallint;stdcall;export;
var
   ByteValue:byte;
begin
   asm
        push dx
        mov dx, PortAddress
        in al,dx
        mov ByteValue,al
        pop dx
    end;
    Inp32:=smallint(ByteValue) and $00FF;
end;
Exports
       Inp32,
       Out32;
begin
end.

Espero que te sirva, Saludos.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 04-09-2006 a las 03:20:02.
Responder Con Cita
  #6  
Antiguo 04-09-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
Esas funciones ¿te funcionan en Windows XP? a mi me sigue dando el error (Privileged instruction) ¿hay que hacer algún otro cambio? ¿instalar algún driver adicional?
Responder Con Cita
  #7  
Antiguo 04-09-2006
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Cita:
Empezado por seoane
Esas funciones ¿te funcionan en Windows XP? a mi me sigue dando el error (Privileged instruction) ¿hay que hacer algún otro cambio? ¿instalar algún driver adicional?
A mi me funcionan porque tengo cambiadas las directivas del sistema. Para utilizarlos sin problemas, te recomiendo que te armes y compiles la DLL con las funciones correspondientes, modificalas a gusto y despues me cuentas.

Por las dudas te dejo la DLL compilada, utilizarla es muy sencillo:

Código:
implementation

function Inp32(wAddr:word):byte; stdcall; external 'inpout32.dll';
function Out32(wAddr:word;bOut:byte):byte; stdcall; external 'inpout32.dll';
Código:
Enviar 65 al puerto 378 hexadecimal}
Out32($378,65);

{Leer del puerto 379 hexadecimal}
ShowMessage( 'Lectura del puerto $379:'+IntToStr(Inp32($379)) );
Saludos.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 19-05-2008 a las 00:45:26.
Responder Con Cita
  #8  
Antiguo 04-09-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
Entonces si que es necesario instalar un driver adicional para acceder a los puertos, y ya que el compilador de delphi no puede generar drivers, este tiene que estar creado con alguna otra herramienta diferente. Te preguntaba por curiosidad, no sabia de nadie que fuera capaz de acceder a los puertos sin utilizar drivers en XP y pensé que tu habías encontrado la forma. Por mi parte yo me conformo con la comunicación serie y los dos pines de salida que puedo manejar solo con funciones de la API.
Responder Con Cita
  #9  
Antiguo 04-09-2006
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 19
MaMu Va por buen camino
Si, entiendo el punto, quizas no me he expresado bien. Hasta donde yo se, siempre es necesario utilizar un driver para acceder a los puertos, ya que de forma nativa no se puede. Lo que se hace comunmente, es agregar el driver al programa y compilarlos juntos. Una libreria muy completa es la del PortTalk, a mi gusto, muy superior a inpout32.dll, y que tambien se encuentra el source por internet.

Saludos.
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
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
leer desde los puerto seriales. G.A.R.S API de Windows 10 24-05-2005 23:54:25
Generador de Seriales wpolanco Varios 0 26-01-2005 23:12:47
Como Leer y escribir puertos Seriales sandragm API de Windows 1 28-04-2004 05:42:00
sobre el puerto paralelo en windows 2000, Xp... redlyon13 Varios 1 01-12-2003 14:50:46
puertos serial y paralelo... emeceuy Varios 2 05-06-2003 10:29:10


La franja horaria es GMT +2. Ahora son las 17:55:28.


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