Simbologia De Los Diagramas De Flujo
Enviado por JOSEDAVID94 • 6 de Febrero de 2014 • 1.457 Palabras (6 Páginas) • 447 Visitas
Escribir en el puerto serie
^
Para enviar caracteres al puerto serie se usa la función WriteFile.
Sin embargo, como ya hemos explicado, no basta con enviar los caracteres al puerto serie, el destinatario puede interrumpir la transmisión si no es capaz de procesar los datos a la misma velocidad que se los enviamos, de modo que los datos que intentamos enviar pueden no ser enviados por completo.
Para estar seguros de que enviamos toda la información que queremos, usaremos uno de los parámetros que devuelve la función, y que nos dice cuántos caracteres se han enviado.
Colocando la función WriteFile en un bucle, podemos enviar los caracteres que aún están pendientes hasta que todos hayan sido enviados.
WriteFile puede retornar con valor false si se ha producido un error. Sin embargo, uno de los errores no es tal, el error ERROR_IO_PENDING en realidad sólo nos informa de que no se ha completado la operación de escritura. En caso de recibir ese error, debemos continuar enviado datos al puerto serie.
Si estamos seguros de que el receptor puede procesar los datos enviados, o si hemos diseñado un mecanismo para que el receptor nos informe de que los datos no han llegado correctamente, podemos ignorar el valor de retorno y el de iBytesWritten de la función WriteFile, y continuar asumiendo que los datos fueron enviados.
void EscribirSerie(HANDLE idComDev, char *buf)
{
char oBuffer[256]; /* Buffer de salida */
DWORD iBytesWritten;
iBytesWritten = 0;
strcpy(oBuffer, buf);
WriteFile(idComDev, oBuffer, strlen(oBuffer), &iBytesWritten, NULL);
}
En la mayor parte de los casos, y sobre todo cuando somos los responsables de programar los dos extremos de la comunicación serie, este modo de trabajar puede ser suficiente.
Leer desde el puerto serie
Por la misma naturaleza de las transmisiones, y debido a que nuestro ordenador normalmente será muy rápido en comparación con las velocidades de transmisión, la mayor parte del tiempo no estaremos recibiendo nada por el puerto serie.
Necesitamos un mecanismo que avise a nuestro programa cuando existan datos para leer, pero no debemos bloquear el sistema preguntando constantemente si hay algo preparado. Ni siquiera debemos bloquear nuestro programa, a menudo hay otras cosas que hacer además de esperar la llegada de nueva información.
La mejor forma es introducir crear un hilo distinto del de nuestro programa principal. Podemos hacer que ese hilo espere a que haya datos para leer, y cuando eso ocurra, que lo procese.
Lo siguiente que necesitamos saber es cuantos caracteres hay en el buffer de entrada. Para esas dos necesidades podemos usar la función ClearCommError. Esta función nos actualiza una estructura COMSTAT, uno de cuyos miembros es cbInQue, que nos dice cuantos caracteres hay en el buffer de entrada. Si no hay ninguno, no hay nada que hacer, si hay caracteres en el buffer, los leemos y procesamos.
Con ese dato podemos llamar a la función ReadFile, y leer todos los caracteres que haya en el buffer.
// Creamos el hilo:
hHilo = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Hilo, (LPDWORD)&idComDev, 0, &id);
...
// Hilo de escucha del puerto serie:
DWORD Hilo(LPDWORD lpdwParam)
{
DWORD leidos;
COMSTAT cs;
char *cad;
HANDLE idComDev = *((HANDLE*)lpdwParam);
do {
ClearCommError(idComDev, &leidos, &cs);
leidos=0;
/* Leer buffer desde puerto serie */
if(cs.cbInQue) {
cad = new char[cs.cbInQue+3]; // Caracteres en buffer, más retorno de línea, más nulo
ReadFile(idComDev, cad, cs.cbInQue, &leidos, NULL);
ProcesarDatos(cad);
delete[] cad;
}
Sleep(100); // Esperar entre una lectura y otra.
} while(true);
return 0;
}
El tiempo de espera en la función Sleep está elegido arbitrariamente, se puede indicar un tiempo menor, si se necesita una respuesta más rápida por parte del programa. Sin embargo siempre es necesario dejar algún tiempo, para no sobrecargar
...