elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Mejorar el código.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mejorar el código.  (Leído 1,411 veces)
Meta


Desconectado Desconectado

Mensajes: 3.439



Ver Perfil WWW
Mejorar el código.
« en: 7 Agosto 2023, 19:42 pm »

Hola:

Hice un código por parte que vino en un libro de C para Arduino. Este código dice que se puede mejorar que es este. Para ser de un libro, la gente no le gusta un pelo.

Lo que hace el programa es recibir comandos por puerto serie. También recibe datos.

Código
  1. #include <LiquidCrystal.h>
  2.  
  3. // Inicializa la librería con sus pines indicados.
  4. // RS, RW, Enable, D4, D5, D6, D7.
  5. LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
  6. // LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  7.  
  8. // Pin 10 para saber que es luz de fondo.
  9. const byte LuzFondo = 10;
  10.  
  11. const byte Led = 13;              // Declaramos la variable pin del Led.
  12. char caracter;
  13. String comando;
  14.  
  15. void setup()
  16. {
  17.  pinMode(Led, OUTPUT);           // Inicializa el pin del LED como salida:
  18.  Serial.begin(115200);           // Puerto serie 115200 baudios.
  19.  lcd.begin(16, 2);               // Formato de pantalla.
  20.  lcd.clear();                    // Borra la pantalla y su posición superior izquierda.
  21.  lcd.print("    Arduino     ");
  22.  delay(1000);
  23. }
  24.  
  25. void loop()
  26. {
  27.  /*
  28.     Voy leyendo carácter a carácter lo que se recibe por el canal serie
  29.     (mientras llegue algún dato allí), y los voy concatenando uno tras otro
  30.     en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
  31.     acabará cuando pulsamos Enter. El delay es conveniente para no saturar el
  32.     canal serie y que la concatenación se haga de forma ordenada.
  33.   */
  34.  while (Serial.available() > 0)
  35.  {
  36.    caracter = Serial.read();
  37.    comando.concat(caracter);
  38.    delay(10);
  39.  }
  40.  
  41.  /*
  42.     Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
  43.     la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
  44.     que quisiéramos: si el comando es "tal", enciende un Led, si es cual,
  45.     mueve un motor... y así.
  46.   */
  47.  
  48.  // Si los carácteres es recibido y verdadero.
  49.  if (comando.equals("Luz_ON") == true)
  50.  {
  51.    digitalWrite(Led, HIGH); // Enciende el Led 13.
  52.    Serial.write("ON - Led encendido.");    // Envía este mensaje a C++.
  53.    lcd.setCursor(0, 1);
  54.    lcd.print("Luz ON.         "); // Mostrar en el LCD.
  55.  }
  56.  
  57.  
  58.  if (comando.equals("Luz_OFF") == true)
  59.  {
  60.    digitalWrite(Led, LOW); // Apaga el Led 13.
  61.    Serial.write("OFF - Led apagado. ");  // Envía este mensaje a C++.
  62.    lcd.setCursor(0, 1);
  63.    lcd.print("Luz OFF.        "); // Mostrar en el LCD.
  64.  }
  65.  
  66.    if (comando.equals("Salir") == true)
  67.  {
  68.    digitalWrite(Led, LOW); // Apaga el Led 13.
  69.    Serial.write("Ha salido de C#.");  // Envía este mensaje a C++.
  70.    lcd.setCursor(0, 1);
  71.    lcd.print("Ha salido de C#."); // Mostrar en el LCD.
  72.  }
  73.  
  74.  // Limpiamos la cadena para volver a recibir el siguiente comando.
  75.  comando = "";
  76. }
  77.  

He hecho aquí abajo algunos consejos que me dieron por ahí y por allá.
Código
  1. #include <LiquidCrystal.h>
  2.  
  3. // Inicializa la librería con sus pines indicados.
  4. // RS, RW, Enable, D4, D5, D6, D7.
  5. LiquidCrystal lcd(8, NULL, 9, 4, 5, 6, 7);
  6. // LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
  7.  
  8. // Pin 10 para saber que es luz de fondo.
  9. const byte LuzFondo = 10;
  10.  
  11. const byte Led = 13;  // Declaramos la variable pin del Led.
  12. char caracter;
  13. String comando;
  14.  
  15. void setup()
  16. {
  17.  pinMode(Led, OUTPUT);  // Inicializa el pin del LED como salida:
  18.  Serial.begin(115200);  // Puerto serie 115200 baudios.
  19.  lcd.begin(16, 2);      // Formato de pantalla.
  20.  lcd.clear();           // Borra la pantalla y su posición superior izquierda.
  21.  lcd.print("    Arduino     ");
  22.  delay(1000);
  23.  Serial.setTimeout(5);  //Tiempo maximo de espera en ms para el dato en el puerto.
  24. }
  25.  
  26. void loop()
  27. {
  28.  /*
  29.     Voy leyendo carácter a carácter lo que se recibe por el canal serie
  30.     (mientras llegue algún dato allí), y los voy concatenando uno tras otro
  31.     en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
  32.     acabará cuando pulsamos Enter. El delay es conveniente para no saturar el
  33.     canal serie y que la concatenación se haga de forma ordenada.
  34.   */
  35.  while (Serial.available() > 0)
  36.  {
  37.    comando = Serial.readString();  // Lees el stream directamente, la lectura termina segun el timeOut establecido.
  38.    comando.trim();                 // Limpia tabulaciones, espacios en blanco, \r, \n, etc.
  39.  }
  40.  
  41.  /*
  42.     Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
  43.     la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
  44.     que quisiéramos: si el comando es "tal", enciende un Led, si es cual,
  45.     mueve un motor... y así.
  46.   */
  47.  
  48.  // Si los carácteres es recibido y verdadero.
  49.  if (comando.startsWith(F("Luz_ON")) == true)
  50.  {
  51.    digitalWrite(Led, HIGH);                 // Enciende el Led 13.
  52.    Serial.print(F("ON - Led encendido."));  // Envía este mensaje a C++.
  53.    lcd.setCursor(0, 1);
  54.    lcd.print(F("Luz ON.         "));        // Mostrar en el LCD.
  55.  }
  56.  
  57.  
  58.  if (comando.startsWith(F("Luz_OFF")) == true)
  59.  {
  60.    digitalWrite(Led, LOW);                  // Apaga el Led 13.
  61.    Serial.print(F("OFF - Led apagado. "));  // Envía este mensaje a C++.
  62.    lcd.setCursor(0, 1);
  63.    lcd.print(F("Luz OFF.        "));        // Mostrar en el LCD.
  64.  }
  65.  
  66.  if (comando.startsWith(F("Salir")) == true)
  67.  {
  68.    digitalWrite(Led, LOW);                  // Apaga el Led 13.
  69.    Serial.print(F("Ha salido de C++.  "));    // Envía este mensaje a C++.
  70.    lcd.setCursor(0, 1);
  71.    lcd.print(F("Ha salido de C++"));        // Mostrar en el LCD.
  72.  }
  73.  
  74.  // Limpiamos la cadena para volver a recibir el siguiente comando.
  75.  comando = "";
  76. }

Todavía me dice que es muy horrible. A pesar de que funciona bien, pues no es la mejor manera.

Entonces hago esta pregunta.

¿Cuál es la mejor manera?

Ninguno me dice como hacerlo o ponen ejemplos para coger ideas.

El programa de abajo es una interfaz que comunica desde el PC por puerto serie/USB con Arduino bajo Visual Studio Community 2022. Está hecho con C++ nativo.

Puedes enviar comandos pulsando la tecla 1, 2 y 3.
Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <conio.h>      // Controla el _getch.
  4. #include <Windows.h>    // Para mostrar texto en el título de la ventana.
  5. #include <stdio.h>      // Cambio color de fondo y letras.
  6. #include "SerialClass.h"
  7.  
  8. using namespace std;
  9. //using std::cout;
  10. //using std::cin;
  11.  
  12. // Función posición del cursor.
  13. void gotoxy(int ancho_x, int alto_y)
  14. {
  15.    HANDLE hcon;
  16.    hcon = GetStdHandle(STD_OUTPUT_HANDLE);
  17.    COORD dwPos{};
  18.    dwPos.X = ancho_x;
  19.    dwPos.Y = alto_y;
  20.    SetConsoleCursorPosition(hcon, dwPos);
  21. }
  22.  
  23. int main()
  24. {
  25.  
  26. #pragma region "Configuración ventana."
  27.    // Mostrar caracteres correctamente en pantalla y título de la ventana.
  28.    SetConsoleOutputCP(65001);
  29.    wchar_t titulo[128];
  30.    MultiByteToWideChar(CP_UTF8, 0, "Led Arduino C++ nativo", -1, titulo, 128);
  31.    SetConsoleTitleW(titulo);
  32.  
  33.    // Tamaño de la pantalla. Se cambia en los dos últimos dígitos.
  34.    SMALL_RECT r = { 0, 0, 80, 20 }; // X = 80, Y = 20.
  35.    SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &r);
  36.  
  37.    // Cambio color de 6 (naranja / amarillo claro), color letras 0 (negro).
  38.    system("color 60");
  39.  
  40.    // Ocultar cursor.
  41.    CONSOLE_CURSOR_INFO cci;
  42.    GetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  43.    cci.bVisible = 0; // 0 oculta. 1 muestra cursor.
  44.    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);
  45. #pragma endregion
  46.  
  47.  
  48.  
  49.    // Comandos para Arduino.
  50.    char Luz_ON[] = "Luz_ON";       // Envía "Luz_ON" al puerto serie.
  51.    char Luz_OFF[] = "Luz_OFF";
  52.    char salir[] = "Salir";
  53.    char limpiar7[] = "       ";    // Siete espacios en blanco para limpiar un área seleccionado.
  54.    char lectura[50] = "\0";        // Guardan datos de entrada del puerto.
  55.    char tecla;                     // Guarda un 1, 2 o un 3 tipo entero que introduces desde la consola.
  56.  
  57.    // Puerto serie.
  58.    Serial* Puerto = new Serial("COM4");
  59.  
  60.    gotoxy(0, 0);                   // Posición de la pantalla.
  61.    cout << endl;                   // Retorno.
  62.    cout << "Introduzca la opción deseada: " << endl;
  63.    cout << "Pulse 1 para encender el Led y 2 para apagar." << endl << endl;
  64.  
  65.    while (Puerto->IsConnected())
  66.    {
  67.        tecla = _getch();           // Aquí introduces un número, el 1, 2 o el 3.
  68.  
  69.        switch (tecla)              // Espera recibir un 1, 2 o el 3.
  70.        {
  71.        case '1':
  72.            // Encener luz.
  73.            gotoxy(10, 5);
  74.            cout << limpiar7;
  75.            gotoxy(0, 5);
  76.            cout << "Enviando: " << Luz_ON << endl;         // Muestra en pantalla textos.
  77.            Puerto->WriteData(Luz_ON, sizeof(Luz_ON) - 1);  // Envía al puerto el texto "Luz_ON".
  78.            gotoxy(0, 9);
  79.            cout << "                               ";      // Borrado del mensaje si haz pulsado distinto del 1 o la tecla 2.
  80.            break;
  81.  
  82.        case '2':
  83.            // Apagar luz.
  84.            gotoxy(10, 5);
  85.            cout << limpiar7;
  86.            gotoxy(0, 5);
  87.            cout << "Enviando: " << Luz_OFF << endl;
  88.            Puerto->WriteData(Luz_OFF, sizeof(Luz_OFF) - 1);
  89.            gotoxy(0, 9);
  90.            cout << "                               ";
  91.            break;
  92.  
  93.        case '3':
  94.            // Salir.
  95.            gotoxy(10, 5);
  96.            cout << limpiar7;
  97.            gotoxy(0, 5);
  98.            cout << "Enviando: " << salir << endl;
  99.            Puerto->WriteData(salir, sizeof(salir) - 1);
  100.            gotoxy(0, 9);
  101.            cout << "                               ";
  102.            break;
  103.  
  104.        default: // Si haz pulsado otro número distinto del 1 y 2, muestra
  105.            gotoxy(0, 9);
  106.            cout << "Pulse las teclas el 1, el 2 y el 3 para salir.";  // este mensaje.
  107.        }
  108.  
  109.        Sleep(500);
  110.        int numeros = Puerto->ReadData(lectura, 49);            // Recibe datos del puerto serie.
  111.        if (numeros > 0)
  112.        {
  113.            lectura[numeros + 1] = '\0';                        // Limpia de basura la variable.
  114.            gotoxy(0, 7);
  115.            cout << "Recibido: " << lectura << endl;            // Muestra en pantalla dato recibido.
  116.            cout << "-----------------------------" << endl;
  117.        }
  118.    }
  119.    return 0;
  120. }

¿Algún consejo?

Saludos camaradas.


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
mejorar codigo
Java
winnipu 2 3,355 Último mensaje 2 Enero 2015, 16:04 pm
por winnipu
Mejorar este código
.NET (C#, VB.NET, ASP)
Meta 1 2,112 Último mensaje 12 Diciembre 2015, 21:56 pm
por kub0x
Mejorar la apariencia del código
Sugerencias y dudas sobre el Foro
Borito30 1 2,724 Último mensaje 20 Febrero 2017, 18:41 pm
por #!drvy
Mejorar el codigo
Programación C/C++
AprendiendoAProgramar 5 3,443 Último mensaje 21 Diciembre 2017, 05:13 am
por engel lex
Mejorar el código en C++ nativo
Programación C/C++
Meta 3 2,696 Último mensaje 8 Julio 2020, 04:42 am
por ThunderCls
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines