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.

El ESP32 se bloquea en el código de inicialización de HardwareSerial después de un reinicio de software.

Estoy trabajando en ArduinoIDE con ESP32 y el sensor de huellas dactilares TFP625A. El sensor está conectado al UART2 y es utilizado por la biblioteca FPM a través de HardwareSerial. Todo funciona bien hasta que se realiza un reinicio programático con ESP.restart(). Después de este comando, el microcontrolador se reinicia y se queda atascado en el momento de la inicialización del sensor. Inserté algunos Serial.print() en el archivo de código fuente de HardwareSerial y vi que en la función HardwareSerial::begin(), el código no avanza más allá de este punto:

_uart = uartBegin(_uart_nr, baud ? baud : 9600, config, rxPin, txPin, 256, invert);

Según entiendo, después de reiniciar el microcontrolador, la información sobre el UART2 configurado previamente permanece en sus registros. Los intentos de poner el UART a cero antes de reiniciar el microcontrolador no corrigen la situación. Si reinicio el microcontrolador a través del botón de reinicio del hardware, entonces todo funciona bien.

¿Cómo puedo solucionar el problema de atasco del ESP32?

Fragmentos de código:

#include <hardwareserial.h>
#include <fpm.h>

HardwareSerial mySerial(2);
FPM fpm(&mySerial);

void freeFPM()
{
fpm = 0;
mySerial.end();
mySerial = 0;
}

bool fpm_setup()
{
freeFPM();
mySerial = HardwareSerial(2);
finger = FPM(&mySerial);
mySerial.begin(57600);
fpm.begin(0);
}

void restartESP()
{
freeFPM();
ESP.restart();
}</fpm.h></hardwareserial.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el estado de los registros UART2 después del reinicio del ESP32. Una posible solución podría ser restablecer el UART antes de ejecutar el comando de reinicio. Esto se puede lograr utilizando la función uartEnd() seguida de uartBegin() con los mismos parámetros utilizados en la configuración original. Esto debería eliminar cualquier dato residual de los registros UART y asegurar que el sensor se inicialice correctamente después del reinicio.

    Aquí hay un ejemplo de cómo se podría implementar esto en el código:

    C++
    void reiniciarESP()
    {
    freeFPM();
    uartEnd(2);
    uartBegin(2, 9600, SERIAL_8N1, 16, 17);
    ESP.restart();
    }

    En esta versión modificada de la función reiniciarESP(), primero llamamos a freeFPM() para liberar los recursos utilizados por el sensor de huellas dactilares y la comunicación serial. Luego, usamos uartEnd() para detener la comunicación UART2 y restablecer sus registros. Finalmente, llamamos a uartBegin() con los mismos parámetros utilizados anteriormente para reconfigurar la comunicación UART2. Después de esto, podemos llamar de manera segura a ESP.restart() para iniciar el reinicio del ESP32.

    Al restablecer el UART antes del reinicio, nos aseguramos de que se elimine cualquier dato residual y de que el sensor de huellas dactilares se inicialice correctamente después del reinicio. Esperemos que esta solución resuelva el problema de que el ESP32 se quede atascado durante la inicialización del UART2 y el sensor de huellas dactilares.

Comments are closed.