es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Leer en serie, reunir, escribir comandos AT.

Este es probablemente una pregunta de software, no estoy seguro de dónde publicarla (Arduino sub? electronics sub?).

Tengo un Arduino Mega, que está conectado a:
– un lector de tarjetas RFID a través de SPI,
– un chip wifi (esp8266-12f) a través de Serial1.

El chip wifi actúa actualmente como un servidor web ya que quiero enviar comandos a través de internet. También quiero que el chip wifi actúe como un cliente, es decir: cuando el RFID lee una tarjeta, quiero que el Arduino Mega envíe la identificación de la tarjeta RFID al chip wifi a través de Serial1 para que el chip wifi pueda enviar una solicitud http a un servidor dedicado que lo guarde en una base de datos sql.

Esto es cómo lo he programado en el chip wifi hasta ahora:

// Espacio como servidor
// [...]

// Espacio como cliente
timeout = millis() + (10 * 1000UL); // 10s
String input;

while (Serial.available() >= 0 && millis() < timeout) {
  input += Serial.readStringUntil('\r');
  int pos = input.indexOf("AT+TEST");

  if (pos >= 0) {
    Serial.println(F("AT+TEST"));
    // recopilar, es decir, confirmar al Arduino Mega que entendimos el comando y lo estamos procesando
    // hacer: procesar el comando, es decir, analizar el comando, enviar una solicitud http, etc.
    Serial.println(F("\r\nOK"));
  } else {
    Serial.println(F("\r\nNOPE"));
  }
}

Como quizás hayas adivinado, el chip está imprimiendo “AT+TEST” una y otra vez (hasta que se agota el tiempo, luego se repite NOPE infinitamente), ya que está intentando procesar el comando una y otra vez, pero solo quiero que diga “ok Arduino Mega, entendí que quieres que ejecute AT+TEST”.

¿Cuál sería una manera elegante de hacer que el chip wifi “ignore” lo que imprime en su propio puerto serie? Solo debería ejecutar comandos que vengan del Arduino Mega.

Esto es algo que el firmware por defecto de fábrica hace muy bien: cuando envío “AT”, devuelve “AT\r\n\r\nOK” solo una vez.
Encontré esto pero no puedo entender cómo implementaron la idea (código irrelevante en todas partes): https://github.com/JiriBilek/ESPATMod/blob/d6ad63f71ef3189518ef4740f16a9d697c3e843a/ESPATMod/ESP_ATMod.ino#L581

Buscando orientación sobre una forma sólida de lograr esto ya que hay mucha información entrando y saliendo en ese puerto serie del chip wifi.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución al problema del chip WiFi “ignorando” sus propias impresiones y solo ejecutando comandos del Arduino Mega sería utilizar un caracter delimitador, como un carácter específico como ‘$’, para marcar el inicio y el final de cada comando enviado por el Mega.

    En el lado del chip WiFi, podrías modificar el código para leer el búfer Serial hasta que encuentre el carácter delimitador, lo que indicaría que se ha recibido un comando completo. Luego, podrías analizar y ejecutar el comando correspondientemente.

    Aquí hay un ejemplo de código que ilustra este enfoque:

    #define DELIMITADOR_COMANDO '$'
    
    void setup() {
      // ...
    }
    
    void loop() {
      if (Serial1.available()) {
        String input = Serial1.readStringUntil(DELIMITADOR_COMANDO);
    
        // Solo ejecuta el comando si no está vacío
        if (input.length() > 0) {
          // Procesa el comando aquí
          Serial1.println(F("\r\nOK"));
        }
      }
    }
    

    En el lado del Arduino Mega, deberías modificar el código para enviar comandos con el caracter delimitador al final, de esta manera:

    #define DELIMITADOR_COMANDO '$'
    
    void setup() {
      // ...
    }
    
    void loop() {
      // Lee la tarjeta RFID y envía la ID al chip WiFi
      String cardID = leerRFID();
      String comando = "AT+TEST " + cardID + DELIMITADOR_COMANDO;
      Serial1.print(comando);
    }
    

    Al utilizar un caracter delimitador, puedes asegurarte de que el chip WiFi solo ejecute comandos enviados por el Arduino Mega, y no sus propias impresiones. Este enfoque también te permite enviar múltiples comandos en una sola transferencia serie, siempre que cada comando esté delimitado correctamente.

Comments are closed.