Salida de puerto paralelo en C ++ en Win7 x64

4

En primer lugar, he buscado en Internet todo el día, incluso aquí en stackexchange, y no pude encontrar una solución clara. Sólo respuestas ambiguas y enlaces muertos.

  • Comencemos con lo que tengo: mi PC tiene una placa base de 2007, con un puerto paralelo a bordo. Compré un conector de puerto paralelo y soldó un cable al pin 2 y 25 (primer pin de datos y tierra). He poner una resistencia adecuada y un LED.
  • Comencé con la idea de utilizar Procesamiento primero. Después de buscar un poco, encontré la biblioteca PortIO . Lo instalé y probé el ejemplo parpadeante. Sin éxito. El programa parece funcionar (inserté una impresión ("Blink!"); después de cada demora y muestra el mensaje), pero el LED no se enciende. Tengo que mencionar que, cuando reinicio la computadora, el LED se ilumina brevemente. Entonces el puerto está funcionando, pero no puedo controlarlo.
  • Luego pasé a la idea de usar C ++. Mientras buscaba, descubrí que las versiones más recientes de Windows limitan gravemente el acceso del programa al hardware. Bueno, me enteré de inpout32.dll y lo descargué de esta página < em> (solo binarios - x86 y DLL x64 y libs) .
  • Parece que el controlador se instaló correctamente, pero no puedo averiguar cómo usar los archivos. Utilizo Visual Studio 2012, pero no estoy realmente acostumbrado a trabajar con bibliotecas externas y archivos DLL. ¿Dónde tengo que colocar los archivos inpout32.dll, inpout32.h e inpout32.lib y cómo los vinculo?

Y la pregunta más grande es la siguiente: ¿Cómo uso realmente inpout32.dll? ¡No puedo encontrar ningún ejemplo! ¡Ya sea para Basic o C #, o incluso para enlaces más frustrantes, muertos! Para empezar, me gustaría simplemente encender y apagar el LED. Entonces puedo imaginar proyectos más complicados.

    
pregunta Azurium

2 respuestas

4

Primero, obtener un acceso al puerto paralelo en Win7, Vista e incluso WinXP es un esfuerzo importante. Microsoft eliminó la capacidad del código de usuario normal para poder acceder directamente a los registros de hardware. En su lugar, virtualizaron los accesos y, si intentas hacerlo, parece que normalmente se ejecutaron, pero no terminan tocando el hardware. Para obtener acceso a algunas soluciones especiales de controladores de dispositivos, InpOut32.DLL es un ejemplo que permite que el código de usuario acceda indirectamente al puerto porque el controlador se ejecuta en el modo del sistema. Anteriormente he usado InpOut32 para algunos experimentos y descubrí que agrega bastante latencia a los accesos, de manera que incluso en máquinas de alta velocidad, la velocidad de conmutación más rápida disponible de pines de puertos paralelos era del orden de menos de 22 KHz. Cuando lo usé estaba codificando en un entorno de codificación no administrado.

Cuando empiezas a escribir código en algo así como VS2012 usando código administrado bajo el marco .NET de Microsoft, tienes que saltar muchos obstáculos para que los controladores adicionales como InpOut32 funcionen (y no es seguro que eso sea lo que realmente ocurre). controlador es incluso viable en el entorno de 64 bits de Win7). No lo he intentado en mi entorno actual de 64 bits porque simplemente no vale la pena esforzarse por tratar de convertirlo en funcionalidad porque hay una pérdida adicional de rendimiento al llamar a un controlador no administrado desde un código de usuario administrado. Se gasta mucho más tiempo usando una de las múltiples opciones de USB disponibles para obtener acceso a la E / S externa a través de un dispositivo de E / S de puente USB.

[ EDIT: Se agregó una idea de salida de puerto USB ]

Un pequeño tablero realmente fácil que puede construir en un proyecto y conectar a una PC con un cable USB Mini-B es el Bit USB Whacker de Sparkfun Electronics . Esta pequeña placa se muestra en la PC como un puerto de comunicación virtual y puede aceptar comandos de texto muy simples que activan y desactivan las salidas o monitorean las entradas.

    
respondido por el Michael Karas
2

Pruebe este enlace: enlace

Utilice su producto IOPort. He usado este controlador a menudo en XP con C ++ Builder y simplemente no es más fácil. Por ejemplo, puede escribir en los datos o en las líneas de control como esta, donde data_addr suele ser 0x378 y

status_addr = data_addr+1;
ctrl_addr = data_addr+2;
IOPort1->Port[data_addr] = data_value;
IOPort1->Port[ctrl_addr] = ctrl_value;

Ha pasado un tiempo desde que usé esto, pero creo que debes configurar uno de los bits de ctrl antes de que puedas leer el data_addr. Creo que las líneas de control son solo de escritura y la línea de estado son de solo lectura.

Por si acaso, aquí hay un artículo bastante bueno sobre el uso del puerto de impresora. enlace Preste especial atención a las resistencias de 330 ohmios que muestran. Son imprescindibles de usar.

También preste atención al bit 5 en el puerto ctrl. Controla si estás leyendo o escribiendo los 8 bits de datos.

    
respondido por el user5108_Dan

Lea otras preguntas en las etiquetas