# Hacer una interfaz puerto paralelo con Visual Basic 6



## Meta (Dic 2, 2015)

Hola amigos y amigas:

Hace un tiempo, gracias a los compañeros del foro he logrado hacer funcionar una intefaz controlando el puerto serie con Visual Basic 6, también hay otros lenguajes como indica en este tutorial aún en desarrollo.

Ver tutorial PDF (27 MB).

Ahora em han pedido mucha gente que haga lo mismo para controlar el puerto paralelo tanto entrada de datos como de salida, es decir, poder ver activados y desactivado las entradas del LPT como encender y apagar Led a su salida.

Hace años que hice un tutorial paso a paso con .net de varios lenguajes pero no de Visual Basic 6.

Ver tutorial puerto paralelo.

Me comentan que hay centros de enseñansas que obliga los profesores a los alumnos usar Visual Basic 6, impresionante que aún se siga usando a pesar de estar en el Visual Basic .net 2015 hoy en día desde hace muchos años. Quieren aprovechar sus máquinas viejas que incorporan aún puerto paralelo, por cierto, tengo un sobre mesa Pentium III a 933 MHz que incluye puerto paralelo, también un portatil viejo bajo XP son dicho puerto. También quiero aprovecharlo

Por eso les pido mucho consejos pro aquí que dominan este lenguaje VB 6 para el control del puerto paralelo.

¿Se necesita alguna librería en especial?
¿Se puede hacer directamente el control de un Led?
¿Se peude controlar directamente una entrada digital?

Todo esos detalles antes de empezar a hacer ejemplos para comprobar como funciona, luego haré un tutorial sobre ello tal como hice con el RS232 y VB 6 tal como indica en este PDF.

Un cordial saludo.


----------



## juanma2468 (Dic 2, 2015)

Espero esto te pueda servir.


----------



## Meta (Dic 2, 2015)

Hola:

Muchas gracias. 
Para dejarlo mejor preparado, dejo el enlace de la librerías que si hacen falta.
http://www.highrez.co.uk/Downloads/InpOut32/default.htm

Como indica en los vídeos de arriba, son salidas para encender y apagar Led, falta ejemplos de Visual Basic 6 a la hora de leer datos, como interruptores o pulsadores. 

Otra cosa, buscando dibujos de un buen Led, uno apagado y otro encendido.
https://www.google.es/search?q=apag...ved=0ahUKEwis1rXozL3JAhUC0xQKHQx1AewQ_AUIBigB

Si encuentran algo mejor de lo que he estado buscando, lo muestran por aquí.

Este ya no es tan fácil localizarlo.

¿Hay ordenadores o PC actuales que en la placa base tengan integrado el puerto paralelo?

El mio aunque no lo indica por detrás de la torre, viene clavijas para poner le puerto paralelo, hasta en la BIOS lo indica activado.

Saludos.


----------



## papirrin (Dic 2, 2015)

> ¿Hay ordenadores o PC actuales que en la placa base tengan integrado el puerto paralelo?



Si, todavia hay un monton, yo no se porque dicen que esta obsoleto 

hacerlo con vb .net y hacerlo con VB6 es practicamente lo mismo, se usa la misma libreria, y hay un sinfin de informacion y proyectos.


----------



## Meta (Dic 2, 2015)

Hola:

Ya he encontrado dibujos para probar.
http://www.clker.com/clipart-green-led-off-1.html

Gracias por confirmar lo del puerto paralelo. Se dice que es obsoleto porque ya no se usa mucho actualmente en la simpresoras. Tengo una HP 930 C de puerto paralelo y puerto USB, deja ver en el futuro si con Arduino es capaz de controlarla al menos para imprimir un folio como experimento educativo.

Solo me falta un conector para el puerto paralelo, eso si, en tal caso de que nadie ya disponga ni dentro de la placa el puerto paralelo, usar tarjetas PCI que actualmente los fabrican.

El entorno no es lo mismo en VB .net que en VB 6, no hablo de la dll que es otra cosa, en ese casi si es lo mismo.

Saludos.


----------



## papirrin (Dic 2, 2015)

> El entorno no es lo mismo en VB .net que en VB 6, no hablo de la dll que es otra cosa, en ese casi si es lo mismo


 pero yo no dije que fuera lo mismo, yo dije que hacer el proyecto del puerto paralelo con vb6 es igual que hacerlo con vbnet, se utiliza la misma libreria. la programacion de la interfaz es muy muy similar pero nunca llega a ser lo mismo. por lo que entiendo si ya hiciste una con puerto serial en VBnet, haces nama mas la "traduccion" a vb6 y cambias el control comm por la libreria del puerto paralelo y ya esta. bueno yo no veo cual es la complicacion.


----------



## analogico (Dic 2, 2015)

papirrin dijo:


> Si, todavia hay un monton, yo no se porque dicen que esta obsoleto
> 
> hacerlo con vb .net y hacerlo con VB6 es practicamente lo mismo, se usa la misma libreria, y hay un sinfin de informacion y proyectos.



no no lo es




Meta dijo:


> Solo me falta un conector para el puerto paralelo, eso si, en tal caso de que nadie ya disponga ni dentro de la placa el puerto paralelo, usar tarjetas PCI que actualmente los fabrican.
> .



la libreria funciona usando direcciones de hardware  asi que no es tan simple hacer lo de la tarjeta pci

de todos modos en la epoca del 486 pentiun 1 AT se usaban ese conector con pines  e puerto 
asi que si consiguen una chatarra de esa epoca probablemente les sirva el cable para su nueva placa 
tambien el conector del  cable serie   sirve todavia 

por que encontrarlo de nuevo en su  tienda local es dificil probablemente el vendedor ni conozca el puerto paralelo



de todos modos cada vez menos placas traen ese puerto creo que ahora ninguna de las nuevas, asi que esta al borde de la obsolencia


y la tarjetas pci son para usarlas  en los pocos perifericos industriales que quedan 
y los adaptadores usb solo funcionan en impresoras

asi mejor aprendan a trabajar el puerto serie


----------



## papirrin (Dic 2, 2015)

> no no lo es





me parece extraño, a lo mejor ya cambiaron los compiladores...

antes en el vb6.0 con la dll 32. se ponia  asi:

Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As integer

Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

en VB.net:

se ponia asi:
 Module Module1
    Public Declare Function Inp Lib "inpout32.dll"  Alias "Inp32" (ByVal PortAddress As Integer) As Integer
    Public Declare Sub Out Lib "inpout32.dll"     Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
End Module

a mi eso me parece casi lo mismo, ¿porque dicen que no es casi lo mismo?



> de todos modos cada vez menos placas traen ese puerto creo que ahora ninguna de las nuevas, asi que esta al borde de la obsolencia



es cierto que cada vez son menos, pero basta con poner en google mobo 2015 paralelo, y siguen saliendo motherboards nuevas y pues claro que no del nivel gamer o similar.

eso de que es obsoleto lo vengo viendo casi desde que aparecio el USB, hace no se que cuantas generaciones, y si es muy probable que deje de existir, pero van a apasar un par de generaciones mas para no encontrar ninguna, segun yo.


----------



## Meta (Dic 2, 2015)

Hola:

El LTP y RS232 son obsoletos, el que se usa son USB si o si. Lo que permanecerá en mucho tiempo, y ha si ha sido hasta ahora.

En cuanto a que el de la tienda no sepa que es eso del puerto paralelo en PCI, si lo saben, en tal caso que si me encuentro alguno, se lo explico por el aire, de todas maneras, por internet te lo venden por todas partes y nuevo.







Según me han contado, no hay problemas como has contado, tiene driver.

En mi placa como tiene el puerto LTP o paralelo integrado con sus pines, solo necesito esto.







papirrin dijo:


> analogico dijo:
> 
> 
> > no no lo es
> ...


----------



## papirrin (Dic 2, 2015)

> El tema de las dll si es el mismo, el lenguaje en si para hacer otras cosa no lo es. Otra cosa que cambia es que en VB 6 se puee usar en equipos muy viejos y en .net no, porque no lo permite, a pesar de ello, el VB 6 sigue en pie funcionando por todas partes.



estamos hablando de lo mismo, pero el tema no es tratar las diferencias entre vb6 o vb.net, el tema como dice el titulo es el puerto "paralelo" y es lo que vengo diciendo desde el principio.


----------



## analogico (Dic 2, 2015)

papirrin dijo:


> me parece extraño, a lo mejor ya cambiaron los compiladores...







papirrin dijo:


> hiciste una *con puerto serial *en VBnet, haces nama mas la "traduccion" a vb6 y *cambias el control comm por la libreria del puerto paralelo* y ya esta. bueno yo no veo cual es la complicacion.





papirrin dijo:


> eso de que es obsoleto lo vengo viendo casi desde que aparecio el USB, hace no se que cuantas generaciones, y si es muy probable que deje de existir, pero van a apasar un par de generaciones mas para no encontrar ninguna, segun yo.



eso era para soportar el hardware antiguo,
pero ahora hasta la okidata 320 ahora tiene puerto usb

 y con puerto de disquetera ya no hay




Meta dijo:


> Hola:
> 
> El LTP y RS232 son obsoletos, el que se usa son USB si o si. Lo que permanecerá en mucho tiempo, y ha si ha sido hasta ahora.


pero para  el rs232    siguen saliendo perifericos industriales, ademas del bluethoot y de que los convertidores serie-usb  si  sirven en las mayoria de los casos
ademas de hardware no-pc que incorpora puertos serie 




Meta dijo:


> .
> 
> En cuanto a que el de la tienda no sepa que es eso del puerto paralelo en PCI, si lo saben, en tal caso que si me encuentro alguno, se lo explico por el aire,


es que me a pasado y  en esos casos mejor  ir a otro lado
por que si  no sabe   como confiar en lo que venden




Meta dijo:


> de todas maneras, por internet te lo venden por todas partes y nuevo.


por supuesto pero no a todos les acomoda o pueden comprar por internet





Meta dijo:


> Según me han contado, no hay problemas como has contado, tiene driver.


para las tarjetas pci el driver no importa por que la dll accede a "bajo nivel" usando las direcciones de hardware  estandar , habia una dll que permitia usar direcciones no estandar y la otra daba una pantalla azul    solo que no recuerdo cual lo olvide
tambien hay tarjetas que se pueden configurar paraa que use alguna de las direcciones estandar,   pero la mayoria de las que venden no son de esas




Meta dijo:


> En mi placa como tiene el puerto LTP o paralelo integrado con sus pines, solo necesito esto.


 si



Meta dijo:


> El tema de las dll si es el mismo, el lenguaje en si para hacer otras cosa no lo es. Otra cosa que cambia es que en VB 6 se puee usar en equipos muy viejos y en .net no, porque no lo permite, a pesar de ello, el VB 6 sigue en pie funcionando por todas partes.
> 
> Saludos.



.net se puede usar en windows 98 y windows nt 4 o sea equipos viejos, mas viejo seria usar qbasic


bueno volviendo la tema recomiendo este codigo de vb6
http://www.todorobot.com.ar/usando-el-puerto-paralelo-de-una-pc/
lo probe hace  años y funciona


----------



## Meta (Dic 5, 2015)

Hola:

Si sacan una tarjeta PCI y da problemas. ¿Para qué la sacan? 
Será algunos modelos, por lo que he visto por ahí, funcionan muy bien.

Saludos.


----------



## analogico (Dic 5, 2015)

Meta dijo:


> Hola:
> 
> Si sacan una tarjeta PCI y da problemas. ¿Para qué la sacan?
> Será algunos modelos, por lo que he visto por ahí, funcionan muy bien.
> ...



la tarjeta es para impresoras y otros hardwares no muy antiguos
que    acceden al puerto a travez del driver de la tarjeta


la libreria que se usa en  visual basic accede al puerto usando las direcciones de memoria
(0x378) estandar definidas en el   ibm-pc original  que son fijas y se configuran en el bios
o sea  directo al hardware como se hacia en la epoca  antigua

la tarjeta usa cualquier direccion y cualquier irq disponible   y eso da problemas


----------



## Meta (Dic 6, 2015)

Hola:

Habrá que conseguir librerías que te deje modificar la dirección. Las placas más modernas, desde la BIOS, hay entradas que puedes cambiarlas por salidas, por eso el problema y hay que saber lo que se hace.

Se mira la dirección que dices a ver cual usa en el propio Windwos en Administrador de dispositivo, luego lo programas tal cual indica, no debe haber problemas. *Página 27* de este tutorial.

http://www.slideshare.net/Metaconta2/interfaz-puerto-paralelo-lpt

De todas maneras, está el código fuente de las librerías.
http://www.highrez.co.uk/Downloads/InpOut32/default.htm

Encontré algo de Visual Basic 6 y puerto paralelo.
http://www.slideshare.net/eddyvini/...paralelo-con-visual-basic-60?next_slideshow=1

Una parodia graciosa.





Saludos.


----------



## papirrin (Dic 6, 2015)

Para cambiar la dirección tienes que configurar el puerto desde el BIOS  como E/S (casi ya no hay unidireccionales) y desde VB le das la dirección al pin 2al 9 ya sea de entrada o salida, dentro de los 25 pines hay 4 de entrada y otros tantos de salida que no se pueden cambiar, la verdad no recuerdo cuantos son con exactitud ni cual instrucción se envía con inpout32, pero repito que hay muchísima información.


----------



## analogico (Dic 6, 2015)

Meta dijo:


> Se mira la dirección que dices a ver cual usa en
> el propio Windwos en Administrador de dispositivo, luego lo programas tal cual indica, no debe haber problemas. *Página 27* de este tutorial.
> 
> Saludos.


que facil no...
pero por ejemplo si hacen eso  con el software de todorobot con una tarjeta pci obtendran una pantalla azul


el tutorial ese esta hecho con un puerto integrado en la placa y configurado desde el bios
en ese caso no tendran ningun problema





papirrin dijo:


> Para cambiar la dirección tienes que configurar el puerto desde el BIOS  como E/S (casi ya no hay unidireccionales) y desde VB le das la dirección al pin 2al 9 ya sea de entrada o salida, dentro de los 25 pines hay 4 de entrada y otros tantos de salida que no se pueden cambiar, la verdad no recuerdo cuantos son con exactitud ni cual instrucción se envía con inpout32, pero repito que hay muchísima información.



las direcciones de las tarjetas pci no salen en las bios, 

pero no hay que cambiar nada  con el puerto de la placa base  solo tienen que colocar  la direccion  en el programa 0x378 o 0x278 y eso lo pueden ver en el administrador  de dispositivos como dice el tutorial o desde la bios

y otro problema es que al arrancar   la bios envia señales por el puerto, las que activan involuntariamente
el invento que le tengan conectado


----------



## Meta (Dic 6, 2015)

analogico dijo:


> el tutorial ese esta hecho con un puerto integrado en la placa y configurado desde el bios
> en ese caso no tendran ningun problema
> 
> *Entendido.*
> ...



*Habria que ver que pone en Administrador de positivo, la dirección, en la PCI te lo tiene que dar, precisamente no tiene que ser el que la placa integrada, al guna dirección te tiene quedar. Cuando te de una dirección, usarás esa, por eso en el tutorial te deja cambiarlo, por si tienes otra.

Corregirme si me equivoco.
*


----------



## analogico (Dic 6, 2015)

Meta dijo:


> *Habria que ver que pone en Administrador de positivo, la dirección, en la PCI te lo tiene que dar, precisamente no tiene que ser el que la placa integrada, al guna dirección te tiene quedar. Cuando te de una dirección, usarás esa, por eso en el tutorial te deja cambiarlo, por si tienes otra.
> 
> Corregirme si me equivoco.
> *


claro que la  direccion de la tarjeta pci en el administrador de dispositivos el problema es que al usar esa direccion      con el programam en vb y la libreria da una pantalla azul


en el tutorial deja cambiarla pero eso es para puertos integrados y sus direcciones standar
es que antes habian placas  base con varios puertos paralelos


----------



## Meta (Dic 6, 2015)

Hola:

No te había entendido. En esas DLL, usa la dirección del que marca la BIOS si o si. ¿Te refieres a eso?

Tengo unas ganas de conseguir esa tarje PCI si o si, con serie incluido por si acaso.





Por suerte, presentan el código fuente de las librerías dll.
http://logix4u.net/parallel-port/26-inpoutx64dll-for-win-xp-64-bit

Hay que mirar archivos por archivos del código fuente.

```
// inpout32drv.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "hwinterfacedrv.h"
#include "resource.h"
#include "conio.h"
#include "stdlib.h" 

int inst(LPCTSTR pszDriver);
int start(LPCTSTR pszDriver);

//First, lets set the DRIVERNAME depending on our configuraiton.
#define DRIVERNAMEx64 "hwinterfacex64\0"
#define DRIVERNAMEi386 "hwinterface\0"

char str[10];
int vv;

HANDLE hdriver=NULL;
char path[MAX_PATH];
HINSTANCE hmodule;
SECURITY_ATTRIBUTES sa;
int sysver;

int Opendriver(BOOL bX64);
void Closedriver(void);

BOOL APIENTRY DllMain( HINSTANCE  hModule, 
                      DWORD  ul_reason_for_call, 
                      LPVOID lpReserved
                      )
{

    hmodule = hModule;
    switch(ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        sysver = SystemVersion();
        if(sysver==2)
        {
            Opendriver(IsXP64Bit());
        }
        break;
    case DLL_PROCESS_DETACH:
        if(sysver==2)
        {
            Closedriver();
        }
        break;
    }
    return TRUE;
}

/***********************************************************************/

void Closedriver(void)
{
    if (hdriver)
    {
        OutputDebugString("Closing driver...\n");
        CloseHandle(hdriver);
        hdriver=NULL;
    }
}

void _stdcall Out32(short PortAddress, short data)
{

    switch(sysver)
    {
    case 1:
#ifdef _M_IX86
        _outp( PortAddress,data);    //Will ONLY compile on i386 architecture
#endif
        break;
    case 2:
        unsigned int error;
        DWORD BytesReturned;        
        BYTE Buffer[3];
        unsigned short * pBuffer;
        pBuffer = (unsigned short *)&Buffer[0];
        *pBuffer = LOWORD(PortAddress);
        Buffer[2] = LOBYTE(data);

        error = DeviceIoControl(hdriver,
            IOCTL_WRITE_PORT_UCHAR,
            &Buffer,
            3,
            NULL,
            0,
            &BytesReturned,
            NULL);
        break;
    }


}

/*********************************************************************/

short _stdcall Inp32(short PortAddress)
{
    BYTE retval(0);
    switch(sysver)
    {
    case 1:
#ifdef _M_IX86
        retval = _inp(PortAddress);
#endif
        return retval;
        break;
    case 2:
        unsigned int error;
        DWORD BytesReturned;
        unsigned char Buffer[3];
        unsigned short * pBuffer;
        pBuffer = (unsigned short *)&Buffer;
        *pBuffer = LOWORD(PortAddress);
        Buffer[2] = 0;
        error = DeviceIoControl(hdriver,
            IOCTL_READ_PORT_UCHAR,
            &Buffer,
            2,
            &Buffer,
            1,
            &BytesReturned,
            NULL);

        return((int)Buffer[0]);

        break;
    }
    return 0;
}

/*********************************************************************/

int Opendriver(BOOL bX64)
{
    OutputDebugString("Attempting to open InpOut driver...\n");

    char szFileName[MAX_PATH] = {NULL};
    if (bX64)
        strcpy_s(szFileName, MAX_PATH, "\\\\.\\hwinterfacex64");    //We are 64bit...
    else
        strcpy_s(szFileName, MAX_PATH, "\\\\.\\hwinterface");        //We are 32bit...

    hdriver = CreateFile(szFileName, 
        GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL,
        OPEN_EXISTING, 
        FILE_ATTRIBUTE_NORMAL, 
        NULL);

    if(hdriver == INVALID_HANDLE_VALUE) 
    {
        if(start(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386))
        {
            inst(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);
            start(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);

            hdriver = CreateFile(szFileName, 
                GENERIC_READ | GENERIC_WRITE, 
                0, 
                NULL,
                OPEN_EXISTING, 
                FILE_ATTRIBUTE_NORMAL, 
                NULL);

            if(hdriver != INVALID_HANDLE_VALUE) 
            {
                OutputDebugString("Successfully opened ");
                OutputDebugString(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);
                OutputDebugString(" driver");
                return 0;
            }
        }
        return 1;
    }
    OutputDebugString("Successfully opened ");
    OutputDebugString(bX64 ? DRIVERNAMEx64 : DRIVERNAMEi386);
    OutputDebugString(" driver");
    return 0;
}

/***********************************************************************/
int inst(LPCTSTR pszDriver)
{
    char szDriverSys[MAX_PATH];
    strcpy_s(szDriverSys, MAX_PATH, pszDriver);
    strcat_s(szDriverSys, MAX_PATH, ".sys\0");
    
    SC_HANDLE  Mgr;
    SC_HANDLE  Ser;
    GetSystemDirectory(path , sizeof(path));
    HRSRC hResource = FindResource(hmodule, MAKEINTRESOURCE(IDR_BIN1), "bin");
    if(hResource)
    {
        HGLOBAL binGlob = LoadResource(hmodule, hResource);

        if(binGlob)
        {
            void *binData = LockResource(binGlob);

            if(binData)
            {
                HANDLE file;
                strcat_s(path, sizeof(path), "\\Drivers\\");
                strcat_s(path, sizeof(path), szDriverSys);
            
                file = CreateFile(path,
                    GENERIC_WRITE,
                    0,
                    NULL,
                    CREATE_ALWAYS,
                    0,
                    NULL);

                if(file)
                {
                    DWORD size, written;

                    size = SizeofResource(hmodule, hResource);
                    WriteFile(file, binData, size, &written, NULL);
                    CloseHandle(file);

                }
            }
        }
    }

    Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);
    if (Mgr == NULL)
    {                            //No permission to create service
        if (GetLastError() == ERROR_ACCESS_DENIED) 
        {
            return 5;  // error access denied
        }
    }    
    else
    {
        char szFullPath[MAX_PATH] = "System32\\Drivers\\\0";
        strcat_s(szFullPath, MAX_PATH, szDriverSys);
        Ser = CreateService (Mgr,                      
            pszDriver,                        
            pszDriver,                        
            SERVICE_ALL_ACCESS,                
            SERVICE_KERNEL_DRIVER,             
            SERVICE_SYSTEM_START,               
            SERVICE_ERROR_NORMAL,               
            szFullPath,  
            NULL,                               
            NULL,                              
            NULL,                               
            NULL,                              
            NULL                               
            );
    }
    CloseServiceHandle(Ser);
    CloseServiceHandle(Mgr);

    return 0;
}
/**************************************************************************/
int start(LPCTSTR pszDriver)
{
    SC_HANDLE  Mgr;
    SC_HANDLE  Ser;

    Mgr = OpenSCManager (NULL, NULL,SC_MANAGER_ALL_ACCESS);

    if (Mgr == NULL)
    {                            //No permission to create service
        if (GetLastError() == ERROR_ACCESS_DENIED) 
        {
            Mgr = OpenSCManager (NULL, NULL,GENERIC_READ);
            Ser = OpenService(Mgr,pszDriver,GENERIC_EXECUTE);
            if (Ser)
            {    // we have permission to start the service
                if(!StartService(Ser,0,NULL))
                {
                    CloseServiceHandle (Ser);
                    return 4; // we could open the service but unable to start
                }

            }

        }
    }
    else
    {// Successfuly opened Service Manager with full access
        Ser = OpenService(Mgr,pszDriver,GENERIC_EXECUTE);
        if (Ser)
        {
            if(!StartService(Ser,0,NULL))
            {
                CloseServiceHandle (Ser);
                return 3; // opened the Service handle with full access permission, but unable to start
            }
            else
            {
                CloseServiceHandle (Ser);
                return 0;
            }
        }
    }
    return 1;
}
```
No digo que sea este precisamente. Si está la dirección del puerto paralelo ahí, entonces cambiar dicha dirección que tendrá en la LTP de la PCI y probar.

Voy a investigar más a fondo.


*Edito:*

He estado urgando, parece ser que es esta parte lo que te refieres.





Ver zoom.


```
#define IOCTL_READ_PORT_UCHAR     -1673519100 //CTL_CODE(40000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WRITE_PORT_UCHAR     -1673519096 //CTL_CODE(40000, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
```
Más información de las direcciones.
https://es.wikipedia.org/wiki/Puerto_paralelo

Una vez localizado. ¿Ahora qué?

Saludos.


----------



## analogico (Dic 6, 2015)

Meta dijo:


> Hola:
> 
> No te había entendido. En esas DLL, usa la dirección del que marca la BIOS si o si. ¿Te refieres a eso?
> .


NOOO
esas dll funcionan con las direcciones estandar para los puertos paralelos
378 278 3bc
al usar una direccion no estandar  ocurre un bloqueo a nivel de sistema operativo xp

la direccion no esta en elcodigo por que se pasa como parametro desde el vb




pero prueba con esa dll  modificada en una esa si funciona


----------



## Meta (Dic 6, 2015)

Hola:

Mira arriba otra vez porque he editado y a lo mejor no te has dado cuenta.

Ahora, por lo que cuentas. ¿Qué debo hacer?

Entonces, la interfaz lee las direcciones que hay en el PC, ¿no hay que hacer nada en estas librerías al final?

En el tutorial de arriba las puedes cambiar. Si no hay que cambiar nada en la interfaz ni en el código fuente de esas librerías o dll, entonces. 

¿Qué hay que hacer?

Saludos.


----------



## analogico (Dic 6, 2015)

Meta dijo:


> Hola:
> 
> Mira arriba otra vez porque he editado y a lo mejor no te has dado cuenta.
> 
> ...



lo que hay que hacer es usar el puerto lpt integrado de placa base  y seguro que si funciona 
por que ya lo he hecho


te recomiendo un circuito asi diodos y resistencias





y con el programa fuente de vb de todorobot   lo pruebes



Paralelo-v2-Source. http://www.todorobot.com.ar/usando-el-puerto-paralelo-de-una-pc/

y este otro tambien lo probe  usa otra libreria   la misma que tu tenens el codigo fuente
http://www.sorgonet.com/robotics/sicario/sicario-software.htm
claro que no construi ese robot pero elcodigo del puerto paralelo si funciona


----------



## Meta (Dic 6, 2015)

Hola:

He observado el código Visual Basic. Te dice.

```
'Configura la COMBOLIST cmbLptSelect
    cmbLptSelect.AddItem "0x378"
    cmbLptSelect.AddItem "0x278"
    cmbLptSelect.AddItem "0x3BC"
```

Cuando instales el LTP de PCI, tienes que mirar en administrador de dispositivos, luego poner la dirección indicada. Que sepas, la gran mayoría no le interesa VB 6, me han conmentado que este lengauje no hay que usarse hoy en día, para estas cosas mejor C/C++ nativo. Hay quejicas por todas partes. Personalmente me da igual, mientras funcione.........

Vi el IO, no he visto el código fuente del IO que es lo que me interesa, jejejejeje.

De todas formas, quiero hacer que funcione la librería en tarjetas PCI del puerto paralelo en las 64 bits de hoy en día.

Saludos.


----------



## analogico (Dic 6, 2015)

entonces solo queda probar

despues de mirar en google veo que algunos solucionaron  el problema del pci



cuando estaba haciendo el invento hace años no encontre nada de nada
y eso que probe todas las dll que encontre


----------



## papirrin (Dic 6, 2015)

analogico dijo:


> las direcciones de las tarjetas pci no salen en las bios,


Nada mas aclaro que yo nunca hable de la PCI, el compañero estaba hablando de configurar el BIOS, y hay  o había placas con el puerto paralelo integrado (supuse que de eso hablaba) que se podían configurar como unidireccionales y bidireccionales, y hace como 14 años sufrí mucho para conseguir una tarjeta PCI, supongo que ahora sera un poco mas difícil o caro (obviamente hablo de una PCI paralelo, no de PCI express o similar)
Por PCI cuando use una no tuve ningún problema, si mal no recuerdo solo se busca la dirección asignada en el administrador de dispositivos. Y no tengo idea de lo que están hablando fuera de eso.


----------



## Meta (Dic 6, 2015)

Buenas:

Tarjetas PCI puerto paralelo hoy en día se siguen vendiendo a patadas, hasta quiero comprar uno por si acaso, con puerto serie incluido.

Ver enlace.

Lo que estamos hablando que si usamos el puerto paralelo con la tarjeta PCI, porque no tenemos el puerto integrado porque lo han quitado, si usamos la librería estandar de toda la vida hacia la PCI, da un pantallazo azul según el amigo de arriba, por eso estamos buscando la manera de modificar la librería, que para eso soltaron el código fuente.

Como hay driver actualizados de estar tarjetas PCI que aún venden y no se el motivo, son nuevos, incluuido para Linux.

En el 2008, cuando estaba con el tema del puerto serie, no había documentación que hay ahora, los ejemplos que encontraba era del año de la rasca y no funcionaban en los sistemas modernos, incluido DLL. Empecé a investigar durante meses y haciendo pruebas sobre pruebas, por fin he logrado comunicar por puerto serie con mi propia interfaz hecha con Visual C# con un PIC16F84A. Lo más curioso, empezaron a venir gente hacerme pregutnas por todas partes, es más, con el tiempo y sin cortarse un pelo, me copian y hacen sus propios tutoriales sin contar el verdadero origen de donde los sacó. Un gran ejemplo es este.

Pone el valor de la variable igual que la mia, miBuffer, lo que es más descargado, la misma cantidad de tramas a enviar y los códigos ASCII exactamente los mismos que los mios, así con otros muchos tutoriales más. Luego salen haciendo videotutoriales y se copian entre ellos, da igual que haya 27 tutoriales de lo mismo, yo también harán el suyo propio.

Mi tutorial, mirar la página 157 de 512. El tutorial del copión mirar en la página 12 de 55. 

Así que el tiempo avanza, la vida sigue.

Se me hecharon encima muchas personas por presentar un tutorial con Visual Basic 6, que es obsoleto, no debe usarse, los profesores de la universidad no deben enseñar esto, cosas así, otros siguen hoy en día con ese lenguaje por vídeos sin cortarse un pelo.

Hablando de librerías del puerto serie, aquí están las más usadas y oficiales.
http://rxtx.qbang.org/wiki/index.php/Download

Como ya no se actualiza, se les ocurrieron otras personas actualizarlas en este otro enlace. Tanto de 32 ó 64 bits.
http://jlog.org/rxtx-win.html

Por supuesto que es para Java, ya que en Visual Studio .net no se necesita esas librerías. Es una ventaja.

En otros lenguajes o compiladores si lo necesitan. Para el puerto serie, si podemos, encontramos las web que tengan todas las librerías del puerto paralelo. Siempre hay alguien que las actualiza, aunque sea por hobby o curiosidad, siempre hay alguien en este mundo que hace lo menos que te esperas, aunque esté en ruso.

Si encuentran alguna, poner aquí el enlace, lo examinaremos y modificaremos el código fuente que para eso lo sueltan. A lo mejor querido amigo @analogico, ya no suelen dar pantallazos azules como antes en las tarjetas PCI actuales. Las cosas cambian. La infomación que has dicho que ya lo han solucionado, no se como lo sabes, si es importante, lo haces saber que han hecho.

Ños, que palique hice.

Un saludo.


----------



## papirrin (Dic 7, 2015)

buena tu explicación , pero si era para mi, no era necesaria, a mi nadie me convence de que vb6 y el paralelo son obsoletos son herramientas viejitas pero útiles en muchos casos, por lo menos no quien por lo menos use el google y se de una vuelta. Los paralelos PCI se encuentran pero son caros tomando en cuenta que se consiguen tarjetas madre con procesador incluido seminuevas con paralelo integrado casi al mismo precio, las pciexpress creo andan por el mismo precio o un poco mas caras pero hay mas.
Por lo de tu proyecto la verdad ya hace tiempo que aprendí eso del paralelo y serie en vb6,vbnet y C, y ahora se me hace poco interesante pero te deseo suerte y todo te salga bien.


----------



## analogico (Dic 7, 2015)

papirrin dijo:


> Nada mas aclaro que yo nunca hable de la PCI, el compañero estaba hablando de configurar el BIOS, y hay  o había placas con el puerto paralelo integrado  .



en realidad hablaba de direcciones E/S  , es que eso de la E/S y los irq ya ni se conoce
ahora es todo plug and play

bueno si te fijas en el codigo de la dll la dl lncluye un driver interno el archivo .sys como recurso
por que los sistemas operativos  mas modernos  solo se puede acceder al hardware a traves de drivers, o sea que la dll accede directo al hardware  sin pasar por el driver propio de la tarjeta pci
usando la direccion de memoria del puerto, como se hacia en la epoca del dos








Meta dijo:


> .....
> Lo que estamos hablando que si usamos el puerto paralelo con la tarjeta PCI, porque no tenemos el puerto integrado porque lo han quitado, si usamos la librería estandar de toda la vida hacia la PCI, da un pantallazo azul según el amigo de arriba, por eso estamos buscando
> 
> .......
> ...



todo lo que e dicho es por que lo he hecho, asi lo se

en internet se puede leer que  algunos si solucionaron el problema de la pantalla azul

pero por mi parte nunca pude  y eso que probe todas las dlls que encontre  
aunque en ese tiempo en internet no encontre ninguna solucion


pero como dices las cosas cambian quizas las dlls de ahora si funcionan

pero ya no tengo ni pci       


asi que mejor consigan una tarjeta pci y lo prueban


----------



## Dr. Zoidberg (Dic 7, 2015)

Tienen un problema serio con las placas PCI y eso es por que estas placas no traen un puerto paralelo "real" como traian las viejas placas ISA. El puerto paralelo de las pci funciona perfecto pero NO hay que hablarles directamente al hardware con las DLL esas por que las pci trabajan mapeando memoria y no espacio E/S como los viejos puertos, y por eso les da la pantalla azul.
La forma de que funcione es usando las funciones ioctl para hablar con el driver y jugar con el soft para tratar de lograr que se muevan las lineas tal cual necesitan.


----------



## Meta (Dic 7, 2015)

Hola:

¿Tienes algún ejemplo?

Saludos.


----------



## Dr. Zoidberg (Dic 7, 2015)

Meta dijo:


> Hola:
> ¿Tienes algún ejemplo?
> Saludos.


No tengo a mano algún ejemplo, pero es algo similar al código que pusiste *acá*.
Tengo un driver escrito para Linux (kernel viejo, version 2.algo) y ese habla con el driver del puerto paralelo, pero es diferente de lo que vos necesitás...


----------



## Meta (Dic 7, 2015)

Que pena.

Si has hecho un driver pra Linux, eres un fiera. A ver si hay algo por ahí, a lo mejor no es compatible con todos los modelos de PCI, por lo que cuentan, si hacemos el mismo programa para una.

Saludos.


----------



## analogico (Dic 7, 2015)

Meta dijo:


> Que pena.
> ...
> pra Linux,...



en linux se puede acceder desde /dev/port 
http://www.mileti.com.ar/apuntes/puerto_paralelo_gambas.pdf
(que este mileti tenia errores leves en otros documentos)


```
PUBLIC SUB
 Button2_Click() 
    puertoDatos = OPEN "/dev/port" FOR WRITE 
 SEEK # puertoDatos, &[B]H378[/B]
    Salida = 255
WRITE #puertoDatos, Salida
CLOSE  puertoDatos  
END
```

notese que se accede al 378


tambien si revisan el codigo fuente del nucleo  
hay unos drivers que son para conectar mandos de atari, playstation nintendo al puerto paralelo
aparte de los drivers  de uso mas normal


----------



## Dr. Zoidberg (Dic 7, 2015)

Meta dijo:


> Que pena.
> 
> Si has hecho un driver pra Linux, eres un fiera. A ver si hay algo por ahí, a lo mejor no es compatible con todos los modelos de PCI, por lo que cuentan, si hacemos el mismo programa para una.


Es que yo no hablo con el bus PCI... eso se lo dejo al driver original. El driver que yo escribí usa el driver original para acceder a los puertos, estén donde estén, y yo uso las funciones de esos drivers para leer o escribir en las líneas del puerto y armo una nueva interfaz de software con el nuevo driver para acceder a un conversor A/D de 8 canales y a un conjunto de 4 salidas a relay.

El aparatejo es el de esta foto:


----------



## Meta (Dic 7, 2015)

Ok.

Son cosas que hay que saber. Y si hicieste ese aparato, buen trabajo, me gusta ver estas cosas.


----------



## Meta (Dic 12, 2015)

Hola:

Viendo los comentarios de la gente, la tarjeta PCI LTP o puerto paralelo, tiene asignada una dirección que puedes ver en el administrador de dispositivos, muchas marcas no incluye driver, pero si existe, si no lo encuentra en la Web de dicha tarjeta, mira el tipo de IC y busca por esa Web, que si lo incluyen. Di dejas que Windows haga lo básico, a veces funciona, a veces no, si instala el oficial, te funcionará y depende del SO, incluido Linux y si es de 32 ó 64 bits.

http://foro.metalaficion.com/index.php?topic=9346.0
http://www.foro.lospillaos.es/problema-puerto-paralelo-pci-vt7548.html

Un saludo.


----------

