com o portal ja a funcionar em modo basico

This commit is contained in:
XupaMisto 2026-04-18 17:06:03 +01:00
parent fef33c70ba
commit d892c5fba9
2 changed files with 103 additions and 149 deletions

View File

@ -48,7 +48,6 @@ void ESP_ClearBuffer(void)
} }
/*************************************************/ /*************************************************/
static bool ESP_WaitFor(const char *expect, uint32_t timeout) static bool ESP_WaitFor(const char *expect, uint32_t timeout)
{ {
uint32_t start = HAL_GetTick(); uint32_t start = HAL_GetTick();
@ -63,10 +62,12 @@ static bool ESP_WaitFor(const char *expect, uint32_t timeout)
if (strstr(esp_rx_buf, "busy")) if (strstr(esp_rx_buf, "busy"))
{ {
HAL_Delay(100); // 🔥 ESP ocupado → espera HAL_Delay(100);
ESP_ClearBuffer(); ESP_ClearBuffer();
start = HAL_GetTick(); start = HAL_GetTick();
} }
HAL_Delay(1);
} }
return false; return false;
@ -167,31 +168,45 @@ bool ESP_CloseLink(int link_id)
} }
/*************************************************/ /*************************************************/
void ESP_Init(void) void ESP_Init(void)
{ {
HAL_Delay(1000); // 🔥 manda reset à bruta
ESP_SendCmd("AT", "OK", 2000); ESP_SendData("AT+RST\r\n");
ESP_SendCmd("ATE0", "OK", 2000);
ESP_SendCmd("AT+CIPDINFO=1", "OK", 2000);
ESP_SendCmd("AT+CWMODE=2", "OK", 2000);
ESP_SendCmd("AT+CWSAP=\"STM32\",\"12345678\",1,3,4", "OK", 5000);
HAL_Delay(3000); // 🔥 importante dbg("RESET ESP...\r\n");
ESP_SendCmd("AT+CIPSERVER=0", "OK", 2000); // mata server se existir // 🔥 espera real (não confies no WaitFor)
// ESP_SendCmd("AT+CIPCLOSE=5", "OK", 2000); // fecha tudo (modo multi) HAL_Delay(6000);
HAL_Delay(500);
ESP_ClearBuffer();
dbg("ESP PRONTO\r\n");
// 🔥 agora sim começa
if (!ESP_SendCmd("AT", "OK", 3000))
dbg("AT FAIL\r\n");
if (!ESP_SendCmd("ATE0", "OK", 3000))
dbg("ATE0 FAIL\r\n");
if (!ESP_SendCmd("AT+CIPDINFO=1", "OK", 3000))
dbg("CIPDINFO FAIL\r\n");
if (!ESP_SendCmd("AT+CWMODE=2", "OK", 3000))
dbg("CWMODE FAIL\r\n");
if (!ESP_SendCmd("AT+CWSAP=\"STM32\",\"12345678\",1,3,4", "OK", 8000))
dbg("CWSAP FAIL\r\n");
HAL_Delay(3000);
if (!ESP_SendCmd("AT+CIPMUX=1", "OK", 3000)) if (!ESP_SendCmd("AT+CIPMUX=1", "OK", 3000))
dbg("CIPMUX FAIL\r\n"); dbg("CIPMUX FAIL\r\n");
if (!ESP_SendCmd("AT+CIPSERVER=1,80", "OK", 3000)) if (!ESP_SendCmd("AT+CIPSERVER=1,80", "OK", 5000))
dbg("CIPSERVER FAIL\r\n"); dbg("CIPSERVER FAIL\r\n");
} }
/*************************************************/ /*************************************************/
__attribute__((unused)) __attribute__((unused))
static int parse_ipd_link(const char *p) static int parse_ipd_link(const char *p)
@ -204,19 +219,17 @@ static int parse_ipd_link(const char *p)
/*************************************************/ /*************************************************/
void ESP_Task(void) void ESP_Task(void)
{ {
char *p = strstr(ESP_GetBuffer(), "+IPD,"); char *buf = ESP_GetBuffer();
if (p)
{
int link_id = -1;
int len = 0;
// extrair link_id e tamanho if (!strstr(buf, "GET "))
sscanf(p, "+IPD,%d,%d:", &link_id, &len); return;
dbg("IPD DETECTADO\r\n"); dbg("HTTP DETECTADO\r\n");
// 🔥 esperar fim do pacote // 🔥 ESPERAR O RESTO DO HTTP CHEGAR
HAL_Delay(50); HAL_Delay(200);
int link_id = 0;
const char *resp = const char *resp =
"HTTP/1.1 200 OK\r\n" "HTTP/1.1 200 OK\r\n"
@ -227,17 +240,17 @@ void ESP_Task(void)
char cmd[64]; char cmd[64];
snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d,%d", link_id, strlen(resp)); snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d,%u",
link_id, (unsigned)strlen(resp));
if (ESP_SendCmd(cmd, ">", 2000)) if (ESP_SendCmd(cmd, ">", 3000))
{ {
ESP_SendData(resp); ESP_SendData(resp);
ESP_WaitFor("SEND OK", 3000); ESP_WaitFor("SEND OK", 5000);
} }
snprintf(cmd, sizeof(cmd), "AT+CIPCLOSE=%d", link_id); snprintf(cmd, sizeof(cmd), "AT+CIPCLOSE=%d", link_id);
ESP_SendCmd(cmd, "OK", 2000); ESP_SendCmd(cmd, "OK", 3000);
ESP_ClearBuffer(); // 🔥 só aqui ESP_ClearBuffer();
}
} }

View File

@ -37,7 +37,7 @@
UART_HandleTypeDef huart1; // ESP UART_HandleTypeDef huart1; // ESP
UART_HandleTypeDef huart3; // debug UART_HandleTypeDef huart3; // debug
static uint8_t esp_rx_byte; uint8_t esp_rx_byte;
void SystemClock_Config(void); void SystemClock_Config(void);
static void MX_GPIO_Init(void); static void MX_GPIO_Init(void);
@ -91,32 +91,34 @@ volatile int esp_rx_idx = 0;
volatile uint8_t http_request_flag = 0; volatile uint8_t http_request_flag = 0;
volatile int http_link_id = -1; volatile int http_link_id = -1;
/* USER CODE BEGIN 0 */
// 👇 METE AQUI
static int parse_link_id(const char *buf)
{
char *p = strstr(buf, "+IPD,");
if (!p) return -1;
int id = -1;
sscanf(p, "+IPD,%d,", &id);
return id;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{ {
if (huart->Instance == USART1) if (huart->Instance == USART1)
{ {
// guarda TUDO (sem filtros marados) ESP_RxByte(esp_rx_byte);
if (esp_rx_idx < ESP_RX_BUF_SIZE - 1)
{
esp_rx_buf[esp_rx_idx++] = esp_rx_byte;
esp_rx_buf[esp_rx_idx] = 0;
}
else
{
// buffer cheio → reset suave
esp_rx_idx = 0;
}
HAL_UART_Receive_IT(&huart1, &esp_rx_byte, 1); HAL_UART_Receive_IT(&huart1, &esp_rx_byte, 1);
} }
} }
static void Portal_SendHello(int link_id) static void Portal_SendHello(int link_id)
{ {
char cmd[32]; char cmd[64];
const char *resp = const char *resp =
"HTTP/1.1 200 OK\r\n" "HTTP/1.1 200 OK\r\n"
@ -137,53 +139,44 @@ static void Portal_SendHello(int link_id)
int len = strlen(resp); int len = strlen(resp);
// 🔥 limpar buffer ANTES
ESP_ClearBuffer(); ESP_ClearBuffer();
esp_rx_idx = 0; esp_rx_idx = 0;
// 🔥 pedir envio
snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d,%d\r\n", link_id, len); snprintf(cmd, sizeof(cmd), "AT+CIPSEND=%d,%d\r\n", link_id, len);
ESP_SendData(cmd); ESP_SendData(cmd);
// 🔥 esperar pelo '>'
uint32_t t0 = HAL_GetTick(); uint32_t t0 = HAL_GetTick();
while (1) while ((HAL_GetTick() - t0) < 3000)
{ {
if (strstr(esp_rx_buf, ">")) if (strstr(esp_rx_buf, ">"))
break; break;
if (strstr(esp_rx_buf, "ERROR")) if (strstr(esp_rx_buf, "ERROR"))
return; return;
if (HAL_GetTick() - t0 > 2000)
return;
} }
// 🔥 enviar HTML ESP_ClearBuffer();
esp_rx_idx = 0;
ESP_SendData(resp); ESP_SendData(resp);
// 🔥 esperar SEND OK (opcional mas bom)
t0 = HAL_GetTick(); t0 = HAL_GetTick();
while (1) while ((HAL_GetTick() - t0) < 5000)
{ {
if (strstr(esp_rx_buf, "SEND OK")) if (strstr(esp_rx_buf, "SEND OK"))
break; break;
if (strstr(esp_rx_buf, "ERROR")) if (strstr(esp_rx_buf, "ERROR"))
break; break;
if (HAL_GetTick() - t0 > 2000)
break;
} }
// 🔥 fechar ligação
snprintf(cmd, sizeof(cmd), "AT+CIPCLOSE=%d\r\n", link_id); snprintf(cmd, sizeof(cmd), "AT+CIPCLOSE=%d\r\n", link_id);
ESP_SendData(cmd); ESP_SendData(cmd);
// 🔥 limpar para próxima HAL_Delay(100);
ESP_ClearBuffer(); ESP_ClearBuffer();
esp_rx_idx = 0; esp_rx_idx = 0;
http_link_id = -1;
} }
/* USER CODE END 0 */ /* USER CODE END 0 */
@ -240,62 +233,10 @@ int main(void)
while (1) while (1)
{ {
static uint16_t last_idx = 0; ESP_Task(); // só tratar RX + parser HTTP
// 🔍 DETECTAR HTTP
if (!http_request_flag)
{
if (strstr(esp_rx_buf, "GET /"))
{
http_link_id = 0;
http_request_flag = 1;
HAL_UART_Transmit(&huart3,
(uint8_t*)"HTTP DETECTADO\r\n",
17,
100);
// 🔥 limpa logo
esp_rx_idx = 0;
memset(esp_rx_buf, 0, ESP_RX_BUF_SIZE);
last_idx = 0;
}
}
// 🖥 DEBUG (só quando muda)
if (esp_rx_idx != last_idx)
{
HAL_UART_Transmit(&huart3,
(uint8_t*)esp_rx_buf,
esp_rx_idx,
1000);
HAL_UART_Transmit(&huart3, (uint8_t*)"\r\n", 2, 100);
last_idx = esp_rx_idx;
}
// 🌐 RESPONDER
if (http_request_flag)
{
http_request_flag = 0;
HAL_Delay(50); // 🔥 importantíssimo
Portal_SendHello(http_link_id);
// 🔥 limpa depois
esp_rx_idx = 0;
memset(esp_rx_buf, 0, ESP_RX_BUF_SIZE);
last_idx = 0;
}
HAL_Delay(1); HAL_Delay(1);
} }
/* USER CODE END 3 */ /* USER CODE END 3 */
} }