C/Visual C - Datos en buffer puerto serie

 
Vista:

Datos en buffer puerto serie

Publicado por Wylly (11 intervenciones) el 02/05/2003 15:45:08
Hola. Tengo una duda sobre el puerto serie. Cuando empleo el puerto serie a traves de la funcion ReadFile si no hay ningun dato en el buffer se queda esperando a que llegue uno. Mi pregunta es como puedo saber cuantos datos hay en el buffer del puerto serie sin tener que leerlo, de forma que cuando yo vea que hay algun dato pueda leerlo.
Muchas gracias.

Wylly
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Comprobación de datos en el buffer del puerto serie

Publicado por Alejandro (1153 intervenciones) el 20/05/2025 00:06:15
Wylly, para saber cuántos datos hay en el buffer del puerto serie sin tener que leerlos, puedes utilizar la función `ClearCommError()` en combinación con `GetCommModemStatus()`. Esta función te permite obtener información sobre el estado del puerto serie, incluyendo la cantidad de bytes disponibles en el buffer de recepción.

Ejemplo de código



Aquí tienes un ejemplo de cómo puedes implementar esto en C++:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <windows.h>
#include <iostream>
 
int main() {
    HANDLE hSerial = CreateFile("COM1",                // Nombre del puerto serie
                                 GENERIC_READ | GENERIC_WRITE,
                                 0,                      // No compartir
                                 NULL,                   // Sin seguridad
                                 OPEN_EXISTING,         // Abrir puerto existente
                                 0,                      // Sin atributos
                                 NULL);                 // Sin plantilla
 
    if (hSerial == INVALID_HANDLE_VALUE) {
        std::cerr << "Error al abrir el puerto serie." << std::endl;
        return 1;
    }
 
    // Variables para almacenar el estado del puerto
    DWORD bytesRead;
    COMSTAT comStat;
    DWORD errors;
 
    // Comprobar el estado del puerto
    if (ClearCommError(hSerial, &errors, &comStat)) {
        // comStat.cbInQue contiene el número de bytes en el buffer de recepción
        std::cout << "Bytes en el buffer de recepción: " << comStat.cbInQue << std::endl;
 
        if (comStat.cbInQue > 0) {
            // Aquí puedes leer los datos si hay bytes disponibles
            char buffer[256];
            ReadFile(hSerial, buffer, comStat.cbInQue, &bytesRead, NULL);
            buffer[bytesRead] = '\0'; // Asegúrate de que el buffer sea una cadena válida
            std::cout << "Datos leídos: " << buffer << std::endl;
        } else {
            std::cout << "No hay datos disponibles en el buffer." << std::endl;
        }
    } else {
        std::cerr << "Error al comprobar el estado del puerto." << std::endl;
    }
 
    // Cerrar el puerto serie
    CloseHandle(hSerial);
    return 0;
}

Explicación del código



1. Abrir el puerto serie: Utilizamos `CreateFile()` para abrir el puerto serie (en este caso, "COM1"). Asegúrate de cambiar el nombre del puerto según sea necesario.

2. Comprobar el estado del puerto: La función `ClearCommError()` se utiliza para obtener el estado del puerto. Esta función llena la estructura `COMSTAT`, que contiene información sobre el buffer.

3. Leer el número de bytes disponibles: El campo `cbInQue` de la estructura `COMSTAT` indica cuántos bytes hay en el buffer de recepción. Si hay bytes disponibles, puedes proceder a leerlos con `ReadFile()`.

4. Cerrar el puerto: Finalmente, cerramos el puerto serie con `CloseHandle()`.

Consideraciones



- Asegúrate de manejar adecuadamente los errores y de cerrar el puerto serie cuando ya no lo necesites.
- Este enfoque te permite verificar la cantidad de datos en el buffer sin bloquear la ejecución del programa, lo que es útil para aplicaciones que requieren una respuesta rápida.

Espero que esta información te sea útil para trabajar con el puerto serie.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar