Tengo problemas para usar el UART en el STM32F103 donde deja de recibir datos, pero no configuro ninguna de las marcas de error.
El dispositivo UART es un ESP8266 a 115.200 baudios. Lo estoy enviando AT\r\n
. El ESP8266 devuelve un eco a cada byte que envío, puedo recibir estos ecos. Sin embargo, cuando se trata de leer la respuesta después de los ecos ( OK
+ algunas líneas nuevas), se agota el tiempo de espera después de recibir un byte.
Aquí está la transacción completa, como se ve en un analizador lógico.
STM32sends:AT\r\n
ESP8266sends:AT\r\r\n\r\nOK\r\n
Enmicódigo,envíounbyte,luegorecibounbytehastaqueseenvíalacargaútil.Luego,estoyintentandoescucharlos7bytesrestantes(\n\r\nOK\r\n
)unoporuno.Reciboel\n
,luegolacomunicaciónseapagadespuésde5segundos(usandoeldepurador,veoqueestáesperandoenelindicadorRXNE
).
Cuandoseagotaeltiempodeespera,veoqueningunodelosindicadoresdeerror(ORENEFEPE
)estánestablecidosenelregistroSR
.
Siintentoleerdosbitsalavez,seagotaeltiempodeesperadelaprimeraHAL_UART_Receive
.
Elprogramacreaciertainformacióndedepuración(acontinuación)amedidaqueenvíacadabyteyrecibeeleco,luegointentarecibirlarespuesta.Elcódigo
He estado golpeando mi cabeza contra esto durante varias horas. ¿Qué podría causar este comportamiento?
Sending 4 bytes: AT(\r\n)
Echo:
Byte 0: sent 65, echo 65 (ORE 0) // A
Byte 1: sent 84, echo 84 (ORE 0) // T
Byte 2: sent 13, echo 13 (ORE 0) // \r
Byte 3: sent 10, echo 13 (ORE 0) // \n, echo \r
Receive:
Recv 10 // \n
Recv fail
RXNE: 0 ORE: 0 NE: 0 FE: 0 PE: 0
Extracto del código que intenta leer los bytes una vez finalizado el envío ( código completo ):
while (1) {
uint8_t recvChar;
if (HAL_UART_Receive(&Device_UART_Handle, &recvChar, 1, 5000) != HAL_OK) {
printf(" Recv fail\r\n");
printf(" RXNE: %d ORE: %d NE: %d FE: %d PE: %d\r\n",
__HAL_UART_GET_FLAG(&Device_UART_Handle, UART_FLAG_RXNE),
__HAL_UART_GET_FLAG(&Device_UART_Handle, UART_FLAG_ORE),
__HAL_UART_GET_FLAG(&Device_UART_Handle, UART_FLAG_NE),
__HAL_UART_GET_FLAG(&Device_UART_Handle, UART_FLAG_FE),
__HAL_UART_GET_FLAG(&Device_UART_Handle, UART_FLAG_PE));
while(1) {}
}
printf(" Recv %d\r\n", recvChar);
}