manejo del puerto serie a alto nivel

29/01/2004 - 20:42 por Juan Antonio | Informe spam
Hola,
se que este código se encarga de enviar un byte por el
puerto serie, pero no entiendo muy bien lo que hacen los
if que aparecen despues del writefile.

A ver si me echais una mano. Este es el código:

void WriteCommByte( unsigned char ucByte )
{
BOOL bWriteStat;
DWORD dwBytesWritten;

bWriteStat = WriteFile( m_hIDComDev, (LPSTR)
&ucByte, 1, &dwBytesWritten,

&m_OverlappedWrite );
if( !bWriteStat && ( GetLastError() ==
ERROR_IO_PENDING ) )
{
if( WaitForSingleObject(
m_OverlappedWrite.hEvent,
1000 ) ) dwBytesWritten = 0;
else
{
GetOverlappedResult( m_hIDComDev,
&m_OverlappedWrite, &dwBytesWritten,
FALSE );
m_OverlappedWrite.Offset +=
dwBytesWritten;
}

}

gracias de antemano.

un saludo,
Juan Antonio.
 

Leer las respuestas

#1 Josema
29/01/2004 - 21:09 | Informe spam
Bajo win32, la escritura en los puertos se hace de forma "diferida", es
decir, cuando se ejecuta la funcion WriteFile no salen los datos por el
puerto directamente.

Lo que se hace a continuación es comprobar el valor de retorno de la funcion
WriteFile por si ha dado algún error y obtener información del error con
GetLastError. Pero si resulta que el error es ERROR_IO_PENDING, significa
que la operación de entrada/salida todavía no ha terminado y debemos esperar
a que termine. ¿Y como sabemos como termina? Pues mediante el evento
asociado a la estructura OVERLAPPED (traducido como asíncrono) que se le
pasó a la funcion WriteFile. Cuando la operacion de entrada salida termina
el evento asociado a esta estrucutura es levantado y la funcion
WaitForSingleObject termina.

No sé si me he explicado con claridad. Espero que sí. Cuando lo has hecho un
millon de veces o dos, es muy sencillo de entender la lógica.


"Juan Antonio" escribió en el mensaje
news:651f01c3e6a0$0df8a260$
Hola,
se que este código se encarga de enviar un byte por el
puerto serie, pero no entiendo muy bien lo que hacen los
if que aparecen despues del writefile.

A ver si me echais una mano. Este es el código:

void WriteCommByte( unsigned char ucByte )
{
BOOL bWriteStat;
DWORD dwBytesWritten;

bWriteStat = WriteFile( m_hIDComDev, (LPSTR)
&ucByte, 1, &dwBytesWritten,

&m_OverlappedWrite );
if( !bWriteStat && ( GetLastError() =ERROR_IO_PENDING ) )
{
if( WaitForSingleObject(
m_OverlappedWrite.hEvent,
1000 ) ) dwBytesWritten = 0;
else
{
GetOverlappedResult( m_hIDComDev,
&m_OverlappedWrite, &dwBytesWritten,
FALSE );
m_OverlappedWrite.Offset +dwBytesWritten;
}

}

gracias de antemano.

un saludo,
Juan Antonio.

Preguntas similares