Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Adquisicion De Datos Por Puertos

Iniciado por Pogacha, 02 de Febrero de 2005, 05:12:32 PM

« anterior - próximo »

Pogacha

 Que tal, no es referido a programación de juegos (no directamente al menos), pero igual pregunto por si alguien sabe.
¿Como puedo adquirir datos en tiempo constante a alta velocidad a travez del puerto paralelo, o USB o algo así?
Mas de 16 megabaudios por lo menos, en palabras de 16 bits .
Algo así como un DMA (como el de la SoundBlaster) o algo así, pero no tengo ni idea de como funciona esto.

Si alguien sabe como, o a donde mandarme a preguntar o algun link, le agradeceria.

Saludos.

sés

 La verdad es casi no recuerdo nada de esto (me estoy amariconando con tanto Java ¬¬), así que te pego un trozo de mi viejo código para puerto serie:

BOOL CComSerie::Abrir( int nPuerto )
{
BOOL fSuccess;
COMMTIMEOUTS CommTimeOuts;
char szCad[128];

   wsprintf( szCad, "COM%d", nPuerto );

SECURITY_ATTRIBUTES sa;
sa.nLength =sizeof(sa);
sa.lpSecurityDescriptor =NULL;
sa.bInheritHandle =TRUE;
   hComm = CreateFile( szCad, GENERIC_READ | GENERIC_WRITE,
                       0, // exclusive access
                       &sa, // no security attrs
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL |
                       //FILE_FLAG_OVERLAPPED |
     0,
                       NULL );

   if( hComm == INVALID_HANDLE_VALUE )
       return FALSE;

   fSuccess = GetCommState( hComm, &dcb );

   if( !fSuccess )
       return FALSE;

   dcb.BaudRate = CBR_9600;
   dcb.ByteSize = 8;
dcb.Parity = FALSE;
   dcb.StopBits = ONESTOPBIT;
dcb.fBinary = TRUE; // binary mode, no EOF check
dcb.fNull = FALSE;
   dcb.EvtChar = 0;

/*
dcb.BaudRate   = CBR_9600;
dcb.fParity    = FALSE;  // enable parity checking
dcb.fOutxDsrFlow  = FALSE; // DSR output flow control
dcb.fOutxCtsFlow  = FALSE; // CTS output flow control
dcb.fDtrControl   = DTR_CONTROL_DISABLE;
dcb.fRtsControl   = RTS_CONTROL_DISABLE;
dcb.fDsrSensitivity  = FALSE; // DSR sensitivity
dcb.fTXContinueOnXoff = FALSE; // XOFF continues Tx
dcb.fOutX    = FALSE; // XON/XOFF out flow control
dcb.fInX    = FALSE; // XON/XOFF in flow control
dcb.fErrorChar   = FALSE; // enable error replacement
dcb.fNull    = FALSE; // enable null stripping
dcb.fAbortOnError  = TRUE;  // abort reads/writes on error
dcb.XonLim    = 100;   // transmit XON threshold
dcb.XoffLim    = 100;   // transmit XOFF threshold
   dcb.ByteSize   = 8;
   dcb.StopBits   = ONESTOPBIT;
dcb.XonChar    = 0;     // Tx and Rx XON character
dcb.XoffChar   = 0;     // Tx and Rx XOFF character
dcb.ErrorChar   = 0;     // error replacement character
dcb.EofChar    = 0;     // end of input character
dcb.EvtChar    = 0;     // received event character
*/

   fSuccess = SetCommState ( hComm, &dcb );

   if( !fSuccess )
       return ( FALSE );

   SetCommMask( hComm, 0 );

// Aumentar el buffer de entrada si se pierde algún dato
   SetupComm( hComm, 128*1024,4096 );

   CommTimeOuts.ReadIntervalTimeout = 100;
   CommTimeOuts.ReadTotalTimeoutMultiplier = 100;
   CommTimeOuts.ReadTotalTimeoutConstant = 100;
   CommTimeOuts.WriteTotalTimeoutMultiplier = 100;
   CommTimeOuts.WriteTotalTimeoutConstant = 100;
   fSuccess = SetCommTimeouts( hComm, &CommTimeOuts );

   if( !fSuccess ) return FALSE;

LimpiaPuerto();

   return TRUE;
}



-= EDIT =-
La lectura es con ReadFile y la escritura con WriteFile. Mira la documentación de las funciones que viene aquí para ver más sobre su funcionamiento.
Soy indeciso... ¿o no?

averbell


Zaelsius

 Supongo que se habla de Windows y C/C++.

16mbps? Pues USB o FireWire.. me temo que si quieres acceder de manera directa a los datos tendrás que programar a nivel de driver. El SDK de Microsoft para drivers y bajo nivel se llama DDK, y ya no está disponible para descarga gratuita. Tendrás que buscarlo en redes p2p o encargarlo a Microsoft.

Con puertos serie, como ha escrito Sés, es posible la lectura/escritura con Win32, sin demasiadas complicaciones...  pero la velocidad máxima del puerto es de unos 9000bps

PD: ¿ Y para qué necesitas hacer ésto? Si se puede saber.. :rolleyes:  

averbell

 Si el caso es vb te podre ayudar basante , ya que me dedicava a sacar protocolos de los automatas i programarlos mediante puerto serie entre otras cosas

Pogacha

 Si, pido perdon, Visual C++ / win32, y es para un proyecto secreto del curro :ph34r:,  sobre tratado de señales y se requiere adquirir mucha informacion a alta velocidad y tiempo constante, el tema es actualizarme, la ultima vez utilice DOS y puerto paralelo.
Sobre el puerto serie mas o menos tengo idea, el que no se ni encuentro info es el USB.
Si alguien sabe ...
Gracias

nsL

 http://www.lvr.com/usb.htm
http://www.tetradyne.com/dxusb.htm

Es lo poko q encontre por inet en un rato, ya buscare mas si tengo tiempo luego...
Me voy q a las 8 tengo examen practiko de estadistika  (grrr)

Saludos!  B)  
Yo no muero hasta la muerte -

averbell

 en la página de intel tambien habia info y ejemplos para adquirir datos incluso desde VB (usb)