# Problemas con inportb y outportb de Turbo C++



## julio cesar

Hola amigos, tengo problemas al usar las funciones inportb Y outportb, resulta y sale que solo me funcionan despues de haber utilizado la io.dll para visual basic, es decir si reinicio mi pc y lo primero que hago es correr turbo C con las inportb Y outportb no me funciona, pero si primero utilizo visual basic 6.0 para estos fines (manipular el puerto paralelo) ahora sí me funciona turbo C, ¿ acaso hay que inicializar algo en turbo C para que me funcionen las instrucciones que manipulan el puerto paralelo?

LO que hice para utilizar el Turbo C es descomprimir los archivos y ejecutar el TC que se encuentra an la carpeta BIN de TC,,,tiene que ver algo esto?


en verdad muchas gracias por su ayuda.............


----------



## darea

¿Trabajas con Windows XP?


----------



## EinSoldiatGott

julio cesar dijo:
			
		

> Hola amigos, tengo problemas al usar las funciones inportb Y outportb,
> 
> resulta y sale que solo me funcionan despues de haber utilizado la io.dll
> 
> para visual basic, es decir si reinicio mi pc y lo primero que hago es
> 
> correr turbo C con las inportb Y outportb no me funciona, pero si primero
> 
> utilizo visual basic 6.0 para estos fines (manipular el puerto paralelo) ahora
> 
> sí me funciona turbo C, ¿ acaso hay que inicializar algo en turbo C para que
> 
> me funcionen las instrucciones que manipulan el puerto paralelo??????????
> 
> 
> LO que hice para utilizar el Turbo C es descomprimir los archivos y ejecutar
> 
> el TC que se encuentra an la carpeta BIN de TC,,,tiene que ver algo esto??????
> 
> 
> en verdad muchas gracias por su ayuda.............



Lo que pasa es que en Xp estan bloqueados los puertos, en DOS cuesta mucho hacerlos funcionar.

Pero esta interesanteeso que dice que después de inicializarla con vbasic funciona, voy a probarlo.

Lo que se me ocurre es que desde Turbo c++ debemos indicarle que cargue esa dll voy a ver si encuentro como por que también ocupo utilizar turbo c++ en XP.

Saludos y gracias por el dat s enuentr algo le aviso.


----------



## darea

Eso mismo iba a decir yo, XP protege los puertos pero no se como hacerlo funcionar en C++.


----------



## EinSoldiatGott

darea dijo:
			
		

> Eso mismo iba a decir yo, XP protege los puertos pero no se como hacerlo funcionar en C++.



Hola, hace un momento estaba muy contento pues había encontrado algo que tal vez funcionaría

Encontré un programa llamado userport que se supone que solo ocupa correlo un avez y este libera los puertos.

Yo ya lo corrí y le di start pero cada vez que le doy update se me reinicia la PC  y al reiniciar dice que mi pc se ha recuperado de un error grave.

En fin, ya abrí un programa hecho con turbo c pero al darle que saque un dato se tarda como 30 segundos en sacarlo  y aveces ni saca nada.

Dejo el archivo por si alguien quiere intentarlo y si a ustedes si les sirve les agradecería me avisen además de que versión de Windows XP usan.

Yo lo probé con XP Sp3 Profesional

El link es este
http://files.filefront.com/UserPortrar/;5237729;;/fileinformación.html

Saludos


----------



## atmega128

Yo uso el programa giveio y funciona bien.




			
				EinSoldiatGott dijo:
			
		

> darea dijo:
> 
> 
> 
> 
> Eso mismo iba a decir yo, XP protege los puertos pero no se como hacerlo funcionar en C++.
> 
> 
> 
> 
> Hola, hace un momento estaba muy contento pues había encontrado algo que tal vez funcionaría
> 
> Encontré un programa llamado userport que se supone que solo ocupa correlo un avez y este libera los puertos.
> 
> Yo ya lo corrí y le di start pero cada vez que le doy update se me reinicia la PC  y al reiniciar dice que mi pc se ha recuperado de un error grave.
> 
> En fin, ya abrí un programa hecho con turbo c pero al darle que saque un dato se tarda como 30 segundos en sacarlo
> 
> Dejo el archivo por si alguien quiere intentarlo y si a ustedes si les sirve les agradecería me avisen además de que versión de Windows XP usan.
> 
> Yo lo probé con XP Sp3 Profesional
> 
> El link es este
> http://files.filefront.com/UserPortrar/;5237729;;/fileinformación.html
> 
> Saludos
Hacer clic para expandir...


----------



## EinSoldiatGott

atmega128 dijo:
			
		

> Yo uso el programa giveio y funciona bien.




Ahora mismo lo busco, gracias por el dato

Saludos y al rato cuento como me fue.

**********
Debe ser un ejecutable????? Solo encontre un giveios.sys    , imagino que debo ponerlo en system32 pero apoco así de fácil???


Bueno deje lo pruebo a ver si funciona.
Saludos y gracias


----------



## joselito333

Hola a todos.
Con respecto al problema con los puertos en Xp, yo instale el ejecutable ntpot y me dio buenos resultados tanto para Borland C++(no he probado en Turbo), como en Visual C++;
Si con esto pude contribuir; agradeceria comenten sus resultados. 
Descargado de:http://www.fileheap.com/127057/download/


----------



## EinSoldiatGott

joselito333 dijo:
			
		

> Hola a todos.
> Con respecto al problema con los puertos en Xp, yo instale el ejecutable ntpot y me dio buenos resultados tanto para Borland C++(no he probado en Turbo), como en Visual C++;
> Si con esto pude contribuir; agradeceria comenten sus resultados.
> Descargado de:http://www.fileheap.com/127057/download/




Jeje, lo probaré ya he probado como 5 programas y ninguno me ha funcionado , en este momento pruebo el suyo y comento

Saludos Y Gracias por compartirlo

**** 

Se suma uno más a los intentos fallidos, estoy usando una vesdión de Windows XP Modificada, tal vez sea eso, pero no creo.

Tal vez mañana vaya  casa de un amigo, ahi probaré todos los programas haber si alguno funciona.

Saludos y gracias


----------



## atmega128

Yo lo uso con el software AVRDUDE:

-----------------------------------------
A.2.4.1 Windows NT/2K/XP 
On Windows NT, 2000, and XP user applications cannot directly access the parallel port. However, kernel mode drivers can access the parallel port. giveio.sys is a driver that can allow user applications to set the state of the parallel port pins. 

Before using AVRDUDE, the giveio.sys driver must be loaded. The accompanying command-line program, loaddrv.exe, can do just that. 

To make things even easier there are 3 batch files that are also included: 


install_giveio.bat Install and start the giveio driver. 

status_giveio.bat Check on the status of the giveio driver. 

remove_giveio.bat Stop and remove the giveio driver from memory. 
These 3 batch files calls the loaddrv program with various options to install, start, stop, and remove the driver. 

When you first execute install_giveio.bat, loaddrv.exe and giveio.sys must be in the current directory. When install_giveio.bat is executed it will copy giveio.sys from your current directory to your Windows directory. It will then load the driver from the Windows directory. This means that after the first time install_giveio is executed, you should be able to subsequently execute the batch file from any directory and have it successfully start the driver. 

Note that you must have administrator privilege to load the giveio driver. 

-----------------------------------------


			
				EinSoldiatGott dijo:
			
		

> atmega128 dijo:
> 
> 
> 
> 
> Yo uso el programa giveio y funciona bien.
> 
> 
> 
> 
> 
> Ahora mismo lo busco, gracias por el dato
> 
> Saludos y al rato cuento como me fue.
> 
> **********
> Debe ser un ejecutable????? Solo encontre un giveios.sys    , imagino que debo ponerlo en system32 pero apoco así de fácil???
> 
> 
> Bueno deje lo peubeo a ver si funciona.
> Saludos y gracias
Hacer clic para expandir...


----------



## EinSoldiatGott

atmega128 dijo:
			
		

> Yo lo uso con el software AVRDUDE:



Hola, he conseguido el giveio con su ejecutable e instrucciones
el link es este para el que le interese
http://files.filefront.com/giveiorar/;5247069;;/fileinformación.html

Sin embargo aún no me funciona , debo de agregarle algo a mi código??? declarar alguna librería o dll?

Ya seguí estas instrucciones


> 1. Run the LoadDrv utility with giveio.sys in the same directory and click the install button. This should copy giveio.sys to the systems directory, but I've found that it doesn't. Alternatively, just copy giveio.sys to C:\WINDOWS\system32\drivers.
> 
> 2. In the LoadDrv utility, enter the full pathname of the location of giveio.sys (for example, c:\windows\system32\drivers\giveio.sys).
> 
> 3. In LoadDrv, click the Start button.
> 
> 4. This driver should now be started. If you want the driver to start whenever the computer is restarted proceed with the following steps.
> 
> 5. In the Control Panel, open System and go to the hardware tab.
> 
> 6. Click on the Device Manager button. This will open a new window.
> 
> 7. In the Device Manager window, click on the View menu and select Show hidden devices. This will reveal a Non-Plug and Play Drivers icon in the file tree.
> 
> 8. Expand the Non-Plug and Play Drivers tree.
> 
> 9. Find and right click giveio and select Properties from the popup menu. This will bring up a window of the giveio Properties.
> 
> 10. In the Properties window, select the Driver tab.
> 
> 11. Select Automatic from the dropdown box for the type.
> 
> 12. This change will take effect after you reboot the computer.



Me dice que la aplicación ya esta ejecutándose al darle start, y lo que hace es ponerme en alto todos los bits de salida del puerto.

Pero me voy a ver lo de los plugs & play no me aparece, aunque me encontré ahi el userport que había instalado antes y le di que se ejecutara automáticamente, reinicié pero no pasa nada.

Que windows utiliza usted??? voy a probar formateando e instalando un windows no modificado.

Saludos y gracias


----------



## Dackman

Primero que nada... hola a todos "Espero ayudarlos y que me ayuden", soy novato en el tema de la programacion en Turbo C y no tengo mucha idea.... pero me puse las pilas y encontre algo que creo se nos van a facilitar las cosas.

Disculpen pero tengo muy poco tiempo programando y cambie a Win XP y me lleve la gran sorpresa... he aqui que busco en internet y encontre LO SIGUIENTE QUE LES PASO A EXPLICAR:

YA LA MAYORIA SABE QUE WINXP TRABO LOS PUESTOS PARA QUE EL USUARIO "USERMODE" NO PUEDA HACER NADA O CASI NADA CON ELOS PERO UN TAL Craig Peacock QUE DESARROLLO EL FAMOSO """PORTTALK""" QUE PARA QUE VEAN ALGO TRAE ESTO DE EJEMPLO:

#include <stdio.h>
#include <windows.h>
#include <pt_ioctl.c>

void __cdecl main(void)
{
    unsigned char value;
    printf("IoExample for PortTalk V2.0\nCopyright 2001 Craig Peacock\nhttp://www.beyondlogic.org\n");
    OpenPortTalk();
    outportb(0x378, 0xFF);
    value = inportb(0x378);
    printf("Value returned = 0x%02X \n",value);
    outp(0x378, 0xAA);
    value = inp(0x378);
    printf("Value returned = 0x%02X \n",value);
    ClosePortTalk();
}

QUE NOS FACILITA LA PROGRAMACION CON TURBO C/C++ BAJO WINDOWS XP.

AL NO TENER MUCHA EXPERIENCIA EN PROGRAMACION BAJO TURBO C/C++ Y SUS DERIVADOS LES PONGO EL LINK DE DONDE LO BAJO Y ESPERO QUE PRUEBEN Y ME DIGAN SI LO HICIERON ANDAR YA QUE YO NO PUDE.

http://www.beyondlogic.org/porttalk/porttalk.htm

HICE LO QUE PUDE PERO NO ENCUENTRO LAS SIGUIENTES LIBRERIAS WINIOCTL.H Y WINDOWS.H QUE SON LAS QUE ME DAN ERROR CUANDO COMPILO EL PROGRAMITA DE EJEMPLO.

BUENO ESPERO QUE LES SEA UTIL Y MIENTRAS LO BUSCAN YO SIGO INTENTANDO HACER ALGO CON ESO.


----------



## EinSoldiatGott

Hola, voy a probarlo pero no creo que funcione, yo ya probé como con 10 parches pero estan enfocados a pascal y en turbo c++ no me han funcionado.

Esas librerías que dice, solo vienen en turbo c++ 4.5, pero pueden conseguirse en internet y agregarlas, pero el problema es que windows.h provoca errores en algunas instrucciones tan sencillas como *"delay"*

Bueno eso sería todo en lo que puedo ayudarle , yo también intenté liberar los puertos, pero ya me cancé de intentarlo y me cambié a visual basic.

Si puedo ayudarle en otra cosa solo me avisa

Saludos


----------



## Pampa Norte

¿Probaste buscar si hay un parche para que turbo c corra en xp?


----------



## maunix

Pampa Norte dijo:
			
		

> ¿Probaste buscar si hay un parche para que turbo c corra en xp?



Mmmm, no creo que exista tal cosa porque no hay nada que parchar.

Turbo C es un compilador de 16 bits, que corre en DOS y está pensado para DOS --> acceso directo al hardware

Windows XP es un sistema operativo con 10 años de evolución posterior al turbo c, que encapsula las aplicaciones y no permite el acceso directo al hardware.

La solución sería usar un compilador que haga otro tipo de gestión, ya sea mediante un componente o mediante una dll que a su vez se comunique con güindows   

Casualmente son estas cosas las que hay que cambiar cuando uno porta código de Windows a Linux y viceversa, solo para citar un ejemplo.

No es simplemente cargar un 'parche' y listo.  

Saludos


----------



## leo_programer

lo que dice maunix es muy cierto, yo hice un programa en c++ con visual c++ y usando la libreria que decian al principio io.dll, este me permite tomar control absoluto del puerto paralelo, mas sin embargo creo que no lo libera o algo asi, no soy muy bueno en ingles y la descripcion de esta libreria http://www.geekhideout.com/iodll.shtml lo esta en este idioma, si a alguien le sirve cojanlo, no conozco turbo c++ pero segun lo que dicen, va a quedar dificil que puedan implementar esa dll con ese compilador, utilizen otro como lo recomienda maunix, me avisan, cuidensen...


----------



## Pampa Norte

Yo estoy usando un programa llamado 12c prog v1.5 sirve para programar microcontroladores Atmel por el puerto paralelo. La cosa es que con win 98 funcionaba muy bien pero cuando instalé el xp dejó de funcionar justamente porque no podía acceder al puerto. Pude conseguir un parche que no se si es para el programa o  para el xp y ahora funciona sin problemas. Por eso se me ocurrió decirte lo del parche, entiendo que hay distancias que salvar (este programa corre vajo win y no DOS) pero si el parche o lo que fuera actúa sobre el windows creo que eso no afecta.
El 12c prog v1.5 cuando lo baje estaba disponible en http://go.to/zackyfiles, tal vez puedas fijarte en ese lugar. No recuerdo de donde baje la dll que lo hizo funcionar pero en alguna carpeta de mi Pc lo debo tener y si te interesala busco y te la mando. Creo que no hay nada que perder. Suerte


----------



## EinSoldiatGott

Pampa Norte dijo:
			
		

> Yo estoy usando un programa llamado 12c prog v1.5 sirve para programar microcontroladores Atmel por el puerto paralelo. La cosa es que con win 98 funcionaba muy bien pero cuando instalé el xp dejó de funcionar justamente porque no podía acceder al puerto. Pude conseguir un parche que no se si es para el programa o  para el xp y ahora funciona sin problemas. Por eso se me ocurrió decirte lo del parche, entiendo que hay distancias que salvar (este programa corre vajo win y no DOS) pero si el parche o lo que fuera actúa sobre el windows creo que eso no afecta.
> El 12c prog v1.5 cuando lo baje estaba disponible en http://go.to/zackyfiles, tal vez puedas fijarte en ese lugar. No recuerdo de donde baje la dll que lo hizo funcionar pero en alguna carpeta de mi Pc lo debo tener y si te interesala busco y te la mando. Creo que no hay nada que perder. Suerte



Hola, si quiere puede subir su archivo, tal vez a alguien le sirva.

Pero Mau tiene razón y lo comprobé tras probar con varios "parches", tal vez estos funcionen para Pascal pero al menos a mi para Turbo c++ no me funcionaron, el detalle o la solución no solo es incluir una dll sino que debemos modificar nuestro programa y decirle que utilice esa dll, entonces si va a funcionar.

Así es como lo estoy haciendo en Visual Basic, agrego la inpout32.dll, y además debo compilar el programa con un módulo para esa dll.

Imagino que en Turbo c++ debe ser igual pero no se como decirle que utilice una dll 

Saludos


----------



## MaMu

A ver si despejo dudas, aqui va:

Con la aparicion de los sistemas operativos como el NT y los basados en el, han descartado las funciones que permitian el acceso a puertos del pc de forma directa, puesto a que esto, implicaba que el sistema operativo fuera "poco seguro", motivo por el cual se decidio que el usuario NO tuviera acceso directo al kernel, funcion de privilegio. Por esta razon, se hizo necesario estudiar en estos sistemas operativos, la forma de acceder al Kernel y asi poder controlar la lectura y escritura de los puertos. 
Un usuario, solo tiene acceso a nivel usuario (administrador) pero.... las librerias, como las de enlace dinamico, las que conocemos como DLL, si tienen acceso directo al Kernel, pues, se instalan y ejecutan en ese lugar. El dato, es que las DLL las podemos controlar, y si podemos controlar una DLL, que esta a su vez controle el Kernel, estariamos controlando como usuarios el Kernel de una forma "indirecta", pero controlandolo al fin y al cabo, y asi logramos el cometido, controlar la escritura y lectura de puertos a nuesto gusto. DLL's para este fin hay muchas, usamos las que se nos amolde, o la que logramos encontrar. 
Una tecnica muy buena, es encryptar la dll adentro del ejecutable, y expandirla e instalarla en run time, asi nos olvidamos de distribuirla junto con nuestro programa, ya que esta incorporada.

Saludos.


----------



## maunix

MaMu dijo:
			
		

> Con la aparicion de los sistemas operativos como el NT y los basados en el, han descartado las funciones que permitian el acceso a puertos del pc de forma directa, puesto a que esto, implicaba que el sistema operativo fuera "poco seguro", motivo por el cual se decidio que el usuario NO tuviera acceso directo al kernel, funcion de privilegio. Por esta razon, se hizo necesario estudiar en estos sistemas operativos, la forma de acceder al Kernel y asi poder controlar la lectura y escritura de los puertos.



Exacto! solo que no fue por invento de Microsoft ni de su gente,  sino que los Unix ya lo venían haciendo por más tiempo.  Eso de encapsular aplicaciones   

Jeje, Microsoft nos acercó algunas cosas, pero no las inventó ni mucho menos    

Todavía me acuerdo cuando yo usaba DOS en modo texto y tenía una conocida publicista que usaba su MAC de entonces, controlada con un mouse de 1 solo botón en un entorno totalmente gráfico  8)


----------



## der härteste Stoss

Hola!  
para empezar, quiero aclarar k soy novata en este asunto de la electrónica y d programación. Nos enseñaron a obtener entradas y mandar datos de salida del puerto paralelo; pero lo k me da un poko de miedo, es k al meter una señal desde el proto al puerto, vaya a kemarlo o algo así. kisiera k me ayudaran a "diseñar" o algo así, el circuito, o la manera en k le tendría k meter la señal. El kaso es este: si oprimo un switch, pasa algo, si oprimo otro switch, pasa otro evento. El programa está hecho en C++ y sólo necesito saber cómo incorporar esos switch....
Por otro lado, también tengo otro proyecto    en el kual, tengo k enviar 8 señales aleatorias, y también (como son push botons), mandar una respuesta ala pc si se oprimieron los botones o no.
Agradeciendo de antemano su ayuda y su tiempo, m despido   ops:


----------



## Sir_Hector

Hola, hace mucho tiempo que no uso esto pero hasta donde recuerdo el puerto paralelo usa 8 direcciones para sus recursos que van desde la 0378 - 037F.
Yo me acuerdo que a una de estas direcciones se le asignaba un valor superior a 8 y hacia funcionar el puerto.
Te recomiendo que para verificar con cual numero funciona, primero mandes a leer el valor asignado a cada una de estas direcciones cuando recien prendas la maquina y luego  vuelve a leer los valores de estas direcciones despues que corras tu visualbasic y compares las diferencias.
Puedes escribir a rondonhs@cantv.net y te envio algun programa codigo que tenga por alli pero tengo que buscar bien.


----------



## Carmel

Hola a todos.

Llevo trabajando con el puerto paralelo desde la epoca del MS-DOS y las aplicaciones que programé en su día tanto en DOS con en los Win9x no me sirven ahora para XP, la solución cabe como en un forero anteriormente ha publicado en el driver PortTalk http://www.beyondlogic.org/porttalk/porttalk.htm o usar una dll especializada como la io.dll o la inpout32.dll e implementarla en un lenguaje de programación de windows (vc++, vb6, .net etcetc).
Adjunto una pequeña aplicación realizada en VC++ para mostrar un ejemplo de la io.dll

Saludos


----------



## Martin Sanguineti

Les comento que tango una grabadora de PIC la cual me andaba bien con DOS y windows 9X pero al conectar la grabadora en una maquina mas grande con XP no me andaba. Bueno descubrí que mezclando las funciones " outportb e inportb " con " biosprint " se logra tener control del puerto paralelo bajo el windows XP , haciendo lo siguiente :


                          reemplace donde tenia  " outportb ( puerto , dato ); " 

                                                         por ;

                                        biosprint ( 1 , dato , puerto );
                                        biosprint ( 0 , dato , puerto );
                                        outportb ( puerto , dato );


                           reemplace también  " dato_leido = inportb ( puerto + 1 );

                                                        por;

                                            outportb ( puerto , 4 + 8 );
                                            dato_leido = inportb ( puerto + 1 );                                            

     La explicación de porque esto me anduvo no la se bien , pero me inclino que el BIOS maneja interrupciones y por eso logra acceder al puerto .

     También tuve que reemplazar la función  " delay " por contadores en cascada que me consuman el tiempo necesario para que puedan reemplazar los delay.

    Bueno el programa me anda bien igual que la grabadora en el XP usando el programa de Turbo C++  versión 3.0  ..

    Las características de mi maquina son :   AMD athlon(tm) 64 X 2 Dual Core Processor 4000 +
  2.10 GHz  896 Mb RAM.    El windows XP es :  Profesional  Versión 2002 Service Pack 2.

Espero les funcione.

Para que vean mejor lo que hice les adjunto el Programa en  C.


----------

