Usar el puerto paralelo para leer 16 entradas multiplexadas

#21
Hi Calcasla,
Es indispensable utilizar el VB6?
intente utilizar VC, el puerto es transparentes accesando como LPT1.
:)

PHP:
void receive_string_LPT(unsigned char *a)
{
DWORD bytesRead;
UCHAR rxData = 1;
unsigned char c;
c=0; //inicializa variable
do{
ReadFile(hParallel, &rxData, sizeof(rxData), &bytesRead, NULL); //lee dato del puerto
*(a+c) = rxData; //agrega dato a la cadena
c++; //incrementa el contador de c
}while(rxData != 0x0A && rxData != 0x0); //mientras no sea un Return o nulo
}
void send_byte_LPT(unsigned char Data)
{
DWORD bytesSent;
UCHAR txData;
txData = Data; //asigna valor a trasmitir
WriteFile(hParallel, &txData, sizeof(txData), &bytesSent, NULL); //envia byte por puerto
}
unsigned char init_LPT(void)
{
COMMTIMEOUTS parallelTimeouts; //estatus de puerto
LPCWSTR gszPort;
gszPort = LPT;
SetLastError(0); //cancela ultimo error
hParallel = CreateFile( gszPort, //crea connection a comm
GENERIC_READ | GENERIC_WRITE, 
0, 
0, 
OPEN_EXISTING,
0, //FILE_FLAG_OVERLAPPED,
0);
if(hParallel == INVALID_HANDLE_VALUE)return(0); //envia error
parallelTimeouts.ReadIntervalTimeout = MAXDWORD;
parallelTimeouts.ReadTotalTimeoutMultiplier = 0;
parallelTimeouts.ReadTotalTimeoutConstant = 0;
parallelTimeouts.WriteTotalTimeoutMultiplier = 0;
parallelTimeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hParallel, &parallelTimeouts);
return(1); //envia OK
}
 
#22
Hi Calcasla,
Es indispensable utilizar el VB6?
intente utilizar VC, el puerto es transparentes accesando como LPT1.
:)

PHP:
void receive_string_LPT(unsigned char *a)
{
DWORD bytesRead;
UCHAR rxData = 1;
unsigned char c;
c=0; //inicializa variable
do{
ReadFile(hParallel, &rxData, sizeof(rxData), &bytesRead, NULL); //lee dato del puerto
*(a+c) = rxData; //agrega dato a la cadena
c++; //incrementa el contador de c
}while(rxData != 0x0A && rxData != 0x0); //mientras no sea un Return o nulo
}
void send_byte_LPT(unsigned char Data)
{
DWORD bytesSent;
UCHAR txData;
txData = Data; //asigna valor a trasmitir
WriteFile(hParallel, &txData, sizeof(txData), &bytesSent, NULL); //envia byte por puerto
}
unsigned char init_LPT(void)
{
COMMTIMEOUTS parallelTimeouts; //estatus de puerto
LPCWSTR gszPort;
gszPort = LPT;
SetLastError(0); //cancela ultimo error
hParallel = CreateFile( gszPort, //crea connection a comm
GENERIC_READ | GENERIC_WRITE, 
0, 
0, 
OPEN_EXISTING,
0, //FILE_FLAG_OVERLAPPED,
0);
if(hParallel == INVALID_HANDLE_VALUE)return(0); //envia error
parallelTimeouts.ReadIntervalTimeout = MAXDWORD;
parallelTimeouts.ReadTotalTimeoutMultiplier = 0;
parallelTimeouts.ReadTotalTimeoutConstant = 0;
parallelTimeouts.WriteTotalTimeoutMultiplier = 0;
parallelTimeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hParallel, &parallelTimeouts);
return(1); //envia OK
}
Muchas gracias, pero a lo que me refería era poder hacerlo con un adaptador USB - Paralelo. :)
 
#23
Hi Calcasla,
lo que entiendi es que quieres utilizar el adaptador
USB-Paralelo para controlar 16 puertos I/O.
Cual sería la frecuencia del ciclo de lectura-escritura?

:)
 
#24
Hi Calcasla,
lo que entiendi es que quieres utilizar el adaptador
USB-Paralelo para controlar 16 puertos I/O.
Cual sería la frecuencia del ciclo de lectura-escritura?

:)
¡Hola!
Antes que todo muchas gracias por la ayuda. En realidad no deseo leer 16 entradas por USB - Paralelo, sólo deseo usar el USB - Paralelo para manejar las salidas por defecto y las entradas por defecto que posee, el problema es que no se puede acceder a él a través de la IO.DLL, y ahí radica el inconveniente. Cualquier ayuda es bienvenida.

Gracias:)
 
#27
A mi criterio, se puede hacer siempre y cuando, consigas un adaptador como el que puse en una respuesta anterior que genera un puerto virtual paralelo. Si no, no creo que funcione.
 
#28
Ok,pues si es un driver generico debera ser mas facil de implementar.
al conectar el adaptador, en el administradores de dispositivos debe aparecer
un puerto LPT1, si entras a ver sus propiedades debe indicar que controlador
utiliza en detalles del controlador, algo asi:
C:\WINDOWS\System32\DRIVERS\usbport.sys
:)
 
#29
al conectar el adaptador, en el administradores de dispositivos debe aparecer
un puerto LPT1
No sé si leíste todo el hilo Unikfriend, pero justamente por el tipo de adaptador, no aparece el LPT1 ;)
Son adaptadores que solo permiten impresión y no generan realmente un puerto virtual.
 
#30
hi BlackTiger,
si lo lei completo, a lo mejor entendi mal jiji
lo que entendi es que no aparece la direccion fisica
y por eso no puede usar el IO.dll. Pero al conectar
el USB debe aparecer algun dispositivo
y debe indicar un controlador asociado.

Pero definitivamente yo haria lo que tu sugieres,
si un componente causa tantos problemas no me casara
con el... hay que cambiarlo por otro jiji
:)
 
#31
hi BlackTiger,
si lo lei completo, a lo mejor entendi mal jiji
lo que entendi es que no aparece la direccion fisica
y por eso no puede usar el IO.dll. Pero al conectar
el USB debe aparecer algun dispositivo
y debe indicar un controlador asociado.

Pero definitivamente yo haria lo que tu sugieres,
si un componente causa tantos problemas no me casara
con el... hay que cambiarlo por otro jiji
:)
Saludos a todos. Espero hayan estado bien todo este tiempo. Saben, yo acostumbro a trabajar con IO.dll, pero ahora estoy usando la inpout32.dll, he tenido problemas para leer los pines del DB25 de entrada (pin 10, 12, 13 y 15). Con la IO.dll puedo tener en un label la información, cuando se coloca un entrada a GND, esta queda en 0.

Este es un fragmento de como se lee con IO.dll:

Estado(0) = Lectura And &H8 '= 00001000 en Binario
Estado(1) = Lectura And &H10 '= 00010000 en Binario
Estado(2) = Lectura And &H20 '= 00100000 en Binario
Estado(3) = Lectura And &H40 '= 01000000 en Binario

¿Alguien sabe cómo leerlos con la inpout32.dll?, yo sé que sería con la función Inp, pero no sé cómo traspasar eso a 4 labels que me muestren los estados en 0 ó 1 como la hago con IO.dll.

Les aprovecho de dejar un programa bien sencillo de inpout32.dll que funciona incluso en Windows 7, ahí se puede leer, pero no entiendo bien la manera, agradecería vuestra ayuda y espero les sirva el software, es de mucha utilidad.
Muchas gracias, saludos.
 

Adjuntos

#32
hola tengo un algoritmo de logica difusa en lenguage C con 2 entradas y una salida
lo que deseo hacer ahora es recibir ests dos entradas por el puerto serial, procesarlas y entregar la salida por el mismo puerto serial. uso visual studio 2008 express edition, y tengo windows 7 enterprise. alguien podria decirme como altero mi codigo en C para que haga esta recepcion y transmision???
 
#34
hola, gracias por tu atencion. en realidad soy nuevo programando y hay muchas cosas que aun no entiendo, este algoritmo lo cree, leyendo y haciendo. soy mas matematico que nada, por eso todos los conceptos de transmision de datos me son muy ajenos. estoy en realidad en ceros con este tema, lo que quiero es leer del puerto serial in1 e in2, y dar el valor crisp porel mismo puerto:
 
Última edición:
#35
Hi Alvaro,
y quien te entrega los valores in1 e in2?
tiene algun formato en especial?

Solamente ocupas tres funciones

void[/SIZE] receive_string_COM([/SIZE]unsigned[/SIZE] [/SIZE]char[/SIZE] *a)
{
DWORD bytesRead;
UCHAR r:LOL:ata = 1;
unsigned char c;
c=0;
//inicializa variable
do{
ReadFile(hCom, &r:LOL:ata,
sizeof(r:LOL:ata), &bytesRead, NULL); //lee dato del puerto
*(a+c) = r:LOL:ata; //agrega dato a la cadena
c++; //incrementa el contador de c
}while(r:LOL:ata != 0x0A && r:LOL:ata != 0x0); //mientras no sea un Return o nulo
}
void send_byte_COM(unsigned char Data)
{
DWORD bytesSent;
UCHAR t:LOL:ata;
t:LOL:ata = Data;
WriteFile(hCom, &t:LOL:ata,
sizeof(t:LOL:ata), &bytesSent, NULL); //envia byte por puerto
}
unsigned char init_COM(void)
{
DCB dcb;
//Keeps Port Configuration
int portSuccess; //estatus de puerto
LPCWSTR gszPort;
gszPort = PORT;
hCom = CreateFile(
gszPort,
//crea connection a comm
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
//FILE_FLAG_OVERLAPPED,
0);
if (hCom == INVALID_HANDLE_VALUE)return(0); //envia error
//Get port status
portSuccess = GetCommState(hCom, &dcb); //lee parametros
if(!portSuccess)return(0); //envia error
//Fill in DCB structure
dcb.BaudRate = CBR_9600; //Buad rate de transmision
dcb.ByteSize = 8; //8 bit de dato
dcb.Parity = NOPARITY; //paridad non
dcb.StopBits = ONESTOPBIT; //1 bit de paro
dcb.fDtrControl = 2;
portSuccess = SetCommState(hCom, &dcb);
//escribe parametros
if(!portSuccess)return(0); //envia error
return(1); //envia OK
}
 
Última edición:
#36
in1 e in2 son tipo float
la idea es tomarlos de dos sensores
hacer la comunicacion serial mediante un PIC y controlar una planta de mezclado

estoy trabajando en pasarlo a CUDA-C para que trabaje en paralelo sobre eso he encontrado bastante material, pero no he entendido nada de la comunicacion serial en lenguaje C. la verdad soy un poco cerrado para este tema jajaja

por cierto muchisimas gracias por tu atencion unikfriend
estoy corriendo un poco con esto porque es parte de mi proyecto de grado
 
Última edición:
#37
unikfriend una pregunta, para ese algoritmo que me diste que librerias debo agregar?? algun encabezado en especial?? es que hay algunos comandos que no me reconoce por ejemplo tu colocas unsignedchar pegado y yo lo tuve que separar para que me compilara pero por ejemplo me da esta lista de errores:

ReadFile(hCom, &r:LOL:ata, sizeof(r:LOL:ata), &bytesRead, NULL); //hCom identificador no declarado

gszPort = PORT; //PORT identificador no declarado

disculpa mis preguntas elementales pero es que soy muy nuevo programando
 
#38
Hi Alvaro;
coloca estas declaraciones con las variables globales

#define
[/SIZE] PORT TEXT("Com1") //Com1=0x3f8, Com2=0x2f8, Com3=0x3e8, Com4=0x2e8
HANDLE hCom;

:)
 
Arriba