C/Visual C - puertos

 
Vista:

puertos

Publicado por jorge cote (2 intervenciones) el 24/05/2003 20:12:35
como programar un puerto serial en visual c++
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

Programación de puerto serial en Visual C++

Publicado por Alejandro (1222 intervenciones) el 24/06/2025 17:19:50
Programar un puerto serial en Visual C++ implica utilizar la API de Windows para manejar la comunicación a través de puertos COM. A continuación, te presento una guía básica sobre cómo hacerlo, incluyendo la apertura, lectura y escritura en un puerto serial.

Pasos para programar un puerto serial:



1. Incluir las bibliotecas necesarias:
Asegúrate de incluir las bibliotecas necesarias en tu archivo de código.

1
2
#include <windows.h>
#include <iostream>

2. Abrir el puerto serial:
Utiliza la función `CreateFile` para abrir el puerto serial.

1
2
3
4
5
6
7
8
9
10
11
12
13
HANDLE hSerial;
hSerial = CreateFile("COM1",                // Nombre del puerto
                      GENERIC_READ | GENERIC_WRITE, // Acceso
                      0,                      // Sin compartir
                      NULL,                   // Sin seguridad
                      OPEN_EXISTING,          // Abrir existente
                      0,                      // Sin atributos
                      NULL);                  // Sin plantilla
 
if (hSerial == INVALID_HANDLE_VALUE) {
    std::cerr << "Error al abrir el puerto serial." << std::endl;
    return 1; // Manejo de error
}

3. Configurar el puerto serial:
Configura los parámetros del puerto, como la velocidad en baudios, bits de datos, paridad, etc.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DCB dcbSerialParams = {0};
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
 
if (!GetCommState(hSerial, &dcbSerialParams)) {
    std::cerr << "Error al obtener el estado del puerto." << std::endl;
    return 1; // Manejo de error
}
 
dcbSerialParams.BaudRate = CBR_9600;     // Velocidad en baudios
dcbSerialParams.ByteSize = 8;             // 8 bits de datos
dcbSerialParams.StopBits = ONESTOPBIT;    // 1 bit de parada
dcbSerialParams.Parity = NOPARITY;         // Sin paridad
 
if (!SetCommState(hSerial, &dcbSerialParams)) {
    std::cerr << "Error al configurar el puerto." << std::endl;
    return 1; // Manejo de error
}

4. Leer y escribir datos:
Utiliza `ReadFile` y `WriteFile` para leer y escribir datos en el puerto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Escribir datos
const char* dataToSend = "Hola, puerto serial!";
DWORD bytesWritten;
if (!WriteFile(hSerial, dataToSend, strlen(dataToSend), &bytesWritten, NULL)) {
    std::cerr << "Error al escribir en el puerto." << std::endl;
}
 
// Leer datos
char buffer[256];
DWORD bytesRead;
if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) {
    std::cerr << "Error al leer del puerto." << std::endl;
} else {
    buffer[bytesRead] = '\0'; // Asegúrate de terminar la cadena
    std::cout << "Datos recibidos: " << buffer << std::endl;
}

5. Cerrar el puerto serial:
No olvides cerrar el puerto cuando hayas terminado.

1
CloseHandle(hSerial);

Ejemplo completo:



Aquí tienes un ejemplo completo que combina todos los pasos anteriores:

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
45
46
47
#include <windows.h>
#include <iostream>
 
int main() {
    HANDLE hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
 
    if (hSerial == INVALID_HANDLE_VALUE) {
        std::cerr << "Error al abrir el puerto serial." << std::endl;
        return 1;
    }
 
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
 
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        std::cerr << "Error al obtener el estado del puerto." << std::endl;
        return 1;
    }
 
    dcbSerialParams.BaudRate = CBR_9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
 
    if (!SetCommState(hSerial, &dcbSerialParams)) {
        std::cerr << "Error al configurar el puerto." << std::endl;
        return 1;
    }
 
    const char* dataToSend = "¡Hola, puerto serial!";
    DWORD bytesWritten;
    if (!WriteFile(hSerial, dataToSend, strlen(dataToSend), &bytesWritten, NULL)) {
        std::cerr << "Error al escribir en el puerto." << std::endl;
    }
 
    char buffer[256];
    DWORD bytesRead;
    if (!ReadFile(hSerial, buffer, sizeof(buffer), &bytesRead, NULL)) {
        std::cerr << "Error al leer del puerto." << std::endl;
    } else {
        buffer[bytesRead] = '\0';
        std::cout << "Datos recibidos: " << buffer << std::endl;
    }
 
    CloseHandle(hSerial);
    return 0;
}

Notas:


- Asegúrate de que el puerto COM que estás utilizando esté disponible y configurado correctamente en tu sistema.
- Puedes ajustar los parámetros de configuración según tus necesidades específicas.
- Este ejemplo es básico y puede requerir manejo de errores más robusto y lógica adicional según el contexto de tu aplicación.
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