Dev - C++ - Desde que pulse una tecla, que ejecuta dicha acción

 
Vista:
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por Meta (45 intervenciones) el 02/02/2023 22:48:56
Buenas gente:

Aquí tengo un programa que solo se ejecuta una orden si pulso el 1 y luego Enter.

¿Hay alguna manera que pulse la tecla 1 y me ejecute una acción sin luego pulsar Enter?

Trabajo con Visual Studio Community 2022 con C++ nativo.

El código que es este.
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <fstream>
#include <Windows.h>    // Para mostrar texto en el título de la ventana.
#include <stdio.h>      // Cambio color de fondo y letras.
#include "SerialClass.h"
 
using namespace std;
//using std::cout;
//using std::cin;
 
// Función posición del cursor.
void gotoxy(int x, int y)
{
    HANDLE hcon;
    hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos;
    dwPos.X = x;
    dwPos.Y = y;
    SetConsoleCursorPosition(hcon, dwPos);
}
 
int main()
{
 
#pragma region "Configuración ventana."
    // Mostrar caracteres correctamente en pantalla y título de la ventana.
    SetConsoleOutputCP(65001);
    wchar_t titulo[128];
    MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128);
    SetConsoleTitleW(titulo);
 
    // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
    SMALL_RECT r = { 0, 0, 80, 20 }; // X = 49, Y = 9.
    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
 
    // Cambio color de 6 (naranja claro), color letras 0 (negro).
    system("color 60");
 
    // Ocultar cursor.
    CONSOLE_CURSOR_INFO cci;
    GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
    cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
#pragma endregion
 
    // Puerto serie.
    Serial* Puerto = new Serial("COM4");
 
    // Comandos para Arduino.
    char Luz_ON[] = "Luz_ON";       // Envía "Luz_ON" al puerto serie.
    char Luz_OFF[] = "Luz_OFF";
    char lectura[50] = "\0";        // Guardan datos de entrada del puerto.
 
    int opc; // Guarda un 1 o 2 tipo entero queintroduces desde la consola.
 
    while (Puerto->IsConnected())
    {
        cout << endl;       // Retorno.
        cout << "Introduzca la opcion deseada: " << endl;
        cout << "Pulse 1 para encender el Led, pulse 2 para apagar." << endl << endl; // Muestra texto en pantalla.
 
        cin >> opc;         // Aquí introduces un número, el 1 o el 2.
 
        switch (opc)        // Espera recibir un 1 o un 2.
        {
        case 1:
            // Encener luz.
            cout << "Enviando: " << Luz_ON << endl;         // Muestra en pantalla textos.
            Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);  // Envía al puerto el texto "Luz_ON".
            break;
 
        case 2:
            // Apagar luz.
            cout << "Enviando: " << Luz_OFF << endl;
            Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
            break;
 
        default: // Si haz pulsado otro número distinto del 1 y 2, muestra
            cout << "Puse del 1 al 2.";                     // este mensaje.
        }
 
 
        Sleep(500);
        int n = Puerto->ReadData(lectura, 49);          // Recibe datos del puerto serie.
        if (n > 0)
        {
            lectura[n + 1] = '\0';                      // Limpia de basura la variable.
            cout << "Recibido: " << lectura << endl;    // Muestra en pantalla dato recibido.
            cout << "-------------------" << endl;
        }
 
        cin.ignore(256, '\n');                          // Limpiar buffer del teclado.
    }
}

Saludos.
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
sin imagen de perfil
Val: 1
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por antonio (85 intervenciones) el 03/02/2023 15:46:45
Hola buenas esto esta solucionado en https://stackoverflow.com/questions/7010760/c-keypress-getch-cin-get, utiliza _getch() que es para leer una tecla y solo una tecla, si quieres más de una tecla sería imposible sin usar el enter, lo que ocurre que te coge el numero que del carácter ascii y hay que pasarlo a char y si quieres pasarlo a int tendrias que buscar como se pasa de char a int:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <conio.h>
 
using namespace std;
 
 
int main() {
  cout<<"Presione una tecla: \n";
  int tecla = _getch();
  cout << "La tecla pulsada es: "<<char(tecla)<< endl;
  return 0;
}
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
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por Meta (45 intervenciones) el 04/02/2023 08:59:36
Es bueno saberlo.

Aún así, lo que busco es, desde que pulse una tecla, solo una tecla, por ejemplo el 1, que puede ser una letra colo la a, me ejecute una acción.

Lo que hace por ahora, es pulso un tecla como el 1, luego tengo que pulsar otra tecla que en Enter y ahí es cuando ejecuta la acción, como enviar caracteres por el puerto serie en el ejemplo que puse arriba.

Un cordial saludos.
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
sin imagen de perfil
Val: 1
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por antonio (85 intervenciones) el 04/02/2023 16:08:13
Hola buenas podrías hacer algo como esto poner métodos en case o directamente haciendo en el case como haces tu, pero este cogido funciona si pulsas 1 directamente te ejecuta el medo suma que suma 2+3, si pulsas 2 te hace el método resta que resta 5-1 y si pulsas la letra e sales del bucle pruébalo y cámbialo a lo que quieres hacer:
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 <iostream>
#include <conio.h>
 
 
 
using namespace std;
void suma(){
  cout<<2+3<<"\n";
}
void resta(){
  cout<<5-1<<"\n";
}
 
int main()
{
 
    int opc=0;
 
    while (opc!=101)
    {
        cout << endl;       // Retorno.
        cout << "Introduzca la opcion deseada: " << endl;
        cout << "Pulse 1 para ejecutar metodo suma, pulse 2 ejecutar metodo resta, e para salir del bucle." << endl; // Muestra texto en pantalla.
 
        opc = _getch();         // Aquí introduces un número, el 1 o el 2.
 
        switch (opc)        // Espera recibir un 1 o un 2.
        {
        case 49:
            // ejemplo suma.
            suma();
            break;
 
        case 50:
            // Ejemplo resta.
            resta();
            break;
 
        default: // Si haz pulsado otro número distinto del 1 y 2, muestra
            cout << "Puse del 1 al 2.";                     // este mensaje.
        }
    }
    return 0;
}
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
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por Meta (45 intervenciones) el 04/02/2023 21:51:57
Siguiendo tu ejemplo, la primera vez funciona, sin pulsar Enter,luego hay que pulsar Enter a la segunda vez.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <fstream>
#include <conio.h>      // Controla el _getch.
#include <Windows.h>    // Para mostrar texto en el título de la ventana.
#include <stdio.h>      // Cambio color de fondo y letras.
#include "SerialClass.h"
 
using namespace std;
//using std::cout;
//using std::cin;
 
// Función posición del cursor.
void gotoxy(int ancho_x, int alto_y)
{
    HANDLE hcon;
    hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos{};
    dwPos.X = ancho_x;
    dwPos.Y = alto_y;
    SetConsoleCursorPosition(hcon, dwPos);
}
 
int main()
{
 
#pragma region "Configuración ventana."
    // Mostrar caracteres correctamente en pantalla y título de la ventana.
    SetConsoleOutputCP(65001);
    wchar_t titulo[128];
    MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128);
    SetConsoleTitleW(titulo);
 
    // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
    SMALL_RECT r = { 0, 0, 80, 20 }; // X = 49, Y = 9.
    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
 
    // Cambio color de 6 (naranja claro), color letras 0 (negro).
    system("color 60");
 
    // Ocultar cursor.
    CONSOLE_CURSOR_INFO cci;
    GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
    cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
#pragma endregion
 
    // Puerto serie.
    Serial* Puerto = new Serial("COM4");
 
    // Comandos para Arduino.
    char Luz_ON[] = "Luz_ON";       // Envía "Luz_ON" al puerto serie.
    char Luz_OFF[] = "Luz_OFF";
    char lectura[50] = "\0";        // Guardan datos de entrada del puerto.
 
    char tecla;          // Guarda un 1, 2 o un 3 tipo entero queintroduces desde la consola.
 
    while (Puerto->IsConnected())
    {
        cout << endl;       // Retorno.
        cout << "Introduzca la opcion deseada: " << endl;
        cout << "Pulse 1 para encender el Led, 2 para apagar, 3 para limpiar pantalla." << endl << endl; // Muestra texto en pantalla.
 
        tecla = _getch();         // Aquí introduces un número, el 1 o el 2.
 
        switch (tecla)        // Espera recibir un 1 o un 2.
        {
        case '1':
            // Encener luz.
            cout << "Enviando: " << Luz_ON << endl;         // Muestra en pantalla textos.
            Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);  // Envía al puerto el texto "Luz_ON".
            break;
 
        case '2':
            // Apagar luz.
            cout << "Enviando: " << Luz_OFF << endl;
            Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
            break;
 
        case '3':
            // Limpiar pantalla.
            cout << "Limpiando pantalla..." << endl;
            system("cls"); // Limpiar pantalla.
            break;
 
        default: // Si haz pulsado otro número distinto del 1 y 2, muestra
            cout << "Puse del 1 al 3.";                     // este mensaje.
        }
 
        Sleep(500);
        int n = Puerto->ReadData(lectura, 49);          // Recibe datos del puerto serie.
        if (n > 0)
        {
            lectura[n + 1] = '\0';                      // Limpia de basura la variable.
            cout << "Recibido: " << lectura << endl;    // Muestra en pantalla dato recibido.
            cout << "-------------------" << endl;
        }
 
        cin.ignore(256, '\n');                          // Limpiar buffer del teclado.
    }
 
    return 0;
}
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
sin imagen de perfil
Val: 1
Ha aumentado su posición en 3 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por antonio (85 intervenciones) el 05/02/2023 11:46:08
Hola buenas el problema es el cin.ignore(256, '\n'); que esta esperando leer enter de teclado para proseguir no se si se puede limpiar el buffer de teclado de otra forma sin darle a enter, pero si lo quitas si funciona al menos con el ejemplo que te pase lo he probado introduciendo como 500 caracteres y sigue funcionando.
Quita esa línea y comprueba si va todo correcto, si no es así tendrás que poner una línea que diga limpiando buffer presiona enter. Un saludo
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
sin imagen de perfil
Val: 111
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Desde que pulse una tecla, que ejecuta dicha acción

Publicado por Meta (45 intervenciones) el 05/02/2023 13:02:48
Muchas gracias, ahora funciona tal como quiero.

Hay una excepción. Creo que en vez de enviar el comando Luz_ON por el puerto serie, me envia así, Luz_ON\0. Tiene que estar limpio para que funcione. Porque no me da respuesta.

Dejo el código funcionando, a pesar que no envía bien los comandos tal como quiero.

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <iostream>
#include <fstream>
#include <conio.h>      // Controla el _getch.
#include <Windows.h>    // Para mostrar texto en el título de la ventana.
#include <stdio.h>      // Cambio color de fondo y letras.
#include "SerialClass.h"
 
using namespace std;
//using std::cout;
//using std::cin;
 
// Función posición del cursor.
void gotoxy(int ancho_x, int alto_y)
{
    HANDLE hcon;
    hcon = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD dwPos{};
    dwPos.X = ancho_x;
    dwPos.Y = alto_y;
    SetConsoleCursorPosition(hcon, dwPos);
}
 
int main()
{
 
#pragma region "Configuración ventana."
    // Mostrar caracteres correctamente en pantalla y título de la ventana.
    SetConsoleOutputCP(65001);
    wchar_t titulo[128];
    MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128);
    SetConsoleTitleW(titulo);
 
    // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
    SMALL_RECT r = { 0, 0, 80, 20 }; // X = 49, Y = 9.
    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
 
    // Cambio color de 6 (naranja claro), color letras 0 (negro).
    system("color 60");
 
    // Ocultar cursor.
    CONSOLE_CURSOR_INFO cci;
    GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
    cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
#pragma endregion
 
    // Puerto serie.
    Serial* Puerto = new Serial("COM4");
 
    // Comandos para Arduino.
    char Luz_ON[] = "Luz_ON";       // Envía "Luz_ON" al puerto serie.
    char Luz_OFF[] = "Luz_OFF";
    char limpiar7[] = "       ";    // Siete espacios en blanco para limpiar un área seleccionado.
    char lectura[50] = "\0";        // Guardan datos de entrada del puerto.
 
    char tecla;                     // Guarda un 1, 2 o un 3 tipo entero queintroduces desde la consola.
 
    gotoxy(0, 0);                   // Posición de la pantalla.
    cout << endl;                   // Retorno.
    cout << "Introduzca la opcion deseada: " << endl;
    cout << "Pulse 1 para encender el Led, 2 para apagar, 3 para limpiar pantalla." << endl << endl;
 
    while (Puerto->IsConnected())
    {
        tecla = _getch();     // Aquí introduces un número, el 1 o el 2.
 
        switch (tecla)        // Espera recibir un 1 o un 2.
        {
        case '1':
            // Encener luz.
            gotoxy(10, 5);
            cout << limpiar7;
            gotoxy(0, 5);
            cout << "Enviando: " << Luz_ON << endl;         // Muestra en pantalla textos.
            Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);  // Envía al puerto el texto "Luz_ON".
            break;
 
        case '2':
            // Apagar luz.
            gotoxy(10, 5);
            cout << limpiar7;
            gotoxy(0, 5);
            cout << "Enviando: " << Luz_OFF << endl;
            Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
            break;
 
        default: // Si haz pulsado otro número distinto del 1 y 2, muestra
            cout << "Puse del 1 al 2.";                     // este mensaje.
        }
 
        Sleep(500);
        int n = Puerto->ReadData(lectura, 49);          // Recibe datos del puerto serie.
        if (n > 0)
        {
            lectura[n + 1] = '\0';                      // Limpia de basura la variable.
            gotoxy(0, 7);
            cout << "Recibido: " << lectura << endl;    // Muestra en pantalla dato recibido.
            cout << "-------------------" << endl;
        }
    }
    return 0;
}

Muchas gracias de nuevo mi muy distinguido amigo.
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