Ver Mensaje Individual
  #5  
Antiguo 04-09-2006
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Reputación: 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