Files
FreeRTOS_LoRa_Environment_A…/STM32/Gateway_Node/Drivers/ESP8266.c.bkp

267 lines
8.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "ESP8266.h"
/**
* @brief 恢复ESP8266到出厂设置
* @param None
* @retval None
*/
void vEsp8266Restore(NetFifoBuffer_t *pxEspBuffer)
{
vUsartPrintf(USART2, "AT+RESTORE\r\n");
// if (ucEsp8266ResHandler(pxEspBuffer) == ESP8266_RESPONSE_READY)
// {
// /* code */
// ucEsp8266Log(pxEspBuffer);
// } else
// {
// ucEsp8266Log(pxEspBuffer);
// }
}
/**
* @brief 重置ESP8266模块
* @param None
* @retval None
*/
void vEsp8266Reset(void)
{
vUsartPrintf(USART2, "AT+RST\r\n");
// if (ucEsp8266ResHandler(pxEspBuffer) == ESP8266_RESPONSE_READY)
// {
// /* code */
// ucEsp8266Log(pxEspBuffer);
// } else
// {
// ucEsp8266Log(pxEspBuffer);
// }
}
/**
* @brief 设置ESP8266工作模式
* @param ucMode: 工作模式0SoftAP模式1Station模式
* @retval 设置后的工作模式
*/
eEsp8266Mode_t ucEsp8266SetMode(uint8_t ucMode)
{
vUsartPrintf(USART2, "AT+CWMODE=%d\r\n", ucMode);
if (ucMode == 1)
{
/* code */
return ESP8266_MODE_STATION;
} else if (ucMode == 0)
{
/* code */
return ESP8266_MODE_SOFTAP;
} else
{
return INVALID_MODE; // 无效模式
}
}
/**
* @brief 连接到指定的WiFi热点
* @param *pcSsid: WiFi名称
* @param *pcPassword: WiFi密码
* @retval None
*/
void vEsp8266JoinAp(const char *pcSsid, const char *pcPassword)
{
vUsartPrintf(USART2, "AT+CWJAP=\"%s\",\"%s\"\r\n", pcSsid, pcPassword);
}
/**
* @brief 处理ESP8266响应
* @param *pxEspBuffer ESP8266缓冲区指针
* @retval 0: 继续等待, 1: 成功, 2: 失败
*/
eEsp8266Status_t ucEsp8266ResHandler(NetFifoBuffer_t *pxEspBuffer)
{
// 检查是否收到完整响应
if (strstr(pxEspBuffer->cNetFifoBuffer, "ready") != NULL)
{
vNetBufferClear(pxEspBuffer);
return ESP8266_RESPONSE_READY; // 成功
} else if (strstr(pxEspBuffer->cNetFifoBuffer, "OK") != NULL)
{
vNetBufferClear(pxEspBuffer);
return ESP8266_RESPONSE_OK; // 成功
} else if (strstr(pxEspBuffer->cNetFifoBuffer, "ERROR") != NULL ||
strstr(pxEspBuffer->cNetFifoBuffer, "FAIL") != NULL)
{
vNetBufferClear(pxEspBuffer);
return ESP8266_RESPONSE_ERROR; // 失败
} else
{
/* code */
vNetBufferClear(pxEspBuffer);
return ESP8266_RESPONSE_TIMEOUT; // 继续等待
}
}
// /**
// * @brief 等待ESP8266响应
// * @param *pxEspBuffer ESP8266缓冲区指针
// * @param xTimeout 超时时间以TickType_t为单位
// * @retval 响应状态
// */
// eEsp8266Status_t xEsp8266WaitForResponse(NetFifoBuffer_t *pxEspBuffer, TickType_t xTimeout)
// {
// TickType_t startTime = xTaskGetTickCount();
// while ((xTaskGetTickCount() - startTime) < xTimeout)
// {
// // 检查响应
// eEsp8266Status_t status = ucEsp8266ResHandler(pxEspBuffer);
// if (status != ESP8266_RESPONSE_READY)
// {
// return status; // 返回响应状态
// }
// }
// return ESP8266_RESPONSE_TIMEOUT; // 超时,继续等待
// }
/**
* @brief 记录ESP8266响应日志
* @param *pxEspBuffer ESP8266缓冲区指针
* @retval None
*/
void ucEsp8266Log(NetFifoBuffer_t *pxEspBuffer)
{
if (ucEsp8266ResHandler(pxEspBuffer) == ESP8266_RESPONSE_READY)
{
/* code */
vUsartSendString(USART3, "WiFi Reset Successfully!\r\n");
vUsartSendString(USART3, pxEspBuffer->cNetFifoBuffer);
vUsartSendString(USART3, "\r\n");
} else if (ucEsp8266ResHandler(pxEspBuffer) == ESP8266_RESPONSE_OK)
{
/* code */
vUsartSendString(USART3, "Set WiFi Mode Successfully!\r\n");
vUsartSendString(USART3, pxEspBuffer->cNetFifoBuffer);
vUsartSendString(USART3, "\r\n");
} else if (ucEsp8266ResHandler(pxEspBuffer) == ESP8266_RESPONSE_ERROR)
{
vUsartSendString(USART3, "Error!\r\n");
vUsartSendString(USART3, pxEspBuffer->cNetFifoBuffer);
vUsartSendString(USART3, "\r\n");
} else
{
vUsartSendString(USART3, "Other Error!\r\n");
vUsartSendString(USART3, pxEspBuffer->cNetFifoBuffer);
vUsartSendString(USART3, "\r\n");
}
}
/**
* @brief 连接WiFi任务
* @note 利用FreeRTOS中断消息队列机制接收ESP8266的响应数据并将响应数据存到内置的FIFO缓冲区内。
* @note 问题:将接收消息队列函数和处理响应数据函数混到一块了,造成了代码的冗余。
* @param *pvParameters 任务参数,若没有特定的参数则设置为空指针
* @retval None
*/
void vTaskWifiConnection(void *pvParameters)
{
NetFifoBuffer_t espBuffer;
vNetBufferInit(&espBuffer);
uint8_t ucRetvalQueueWifiSta = 0;
uint8_t ucRetvalQueueByte = 0;
while (1)
{
/* code */
vEsp8266Reset();
TickType_t startTime = xTaskGetTickCount();
while ((xTaskGetTickCount() - startTime) < pdMS_TO_TICKS(3000))
{
ucRetvalQueueWifiSta = xQueueReceive(xQueueUsart2IrqHdlr,
&ucRetvalQueueByte,
pdMS_TO_TICKS(100));
if (ucRetvalQueueWifiSta == pdTRUE)
{
// 将接收到的字节处理到缓冲区
vNetBufferWrite(&espBuffer, (char)ucRetvalQueueByte);
// 处理响应数据
uint8_t ucResponseStatus = ucEsp8266ResHandler(&espBuffer);
if (strstr(espBuffer.cNetFifoBuffer, "ready") != NULL)
{
vUsartSendString(USART3, "WiFi Reset Successfully!\r\n");
vUsartSendString(USART3, espBuffer.cNetFifoBuffer);
vTaskDelay(1000);
break;
} else if (strstr(espBuffer.cNetFifoBuffer, "OK") != NULL)
{
/* code */
vUsartSendString(USART3, "Set WiFi Mode Successfully!\r\n");
vUsartSendString(USART3, espBuffer.cNetFifoBuffer);
} else if (strstr(espBuffer.cNetFifoBuffer, "ERROR") != NULL ||
strstr(espBuffer.cNetFifoBuffer, "FAIL") != NULL)
{
vUsartSendString(USART3, "Error!\r\n");
vUsartSendString(USART3, espBuffer.cNetFifoBuffer);
vUsartSendString(USART3, "\r\n");
break;
}
}
}
vTaskDelete(NULL);
}
}
void vTaskBufferRx(void *pvParameters)
{
NetFifoBuffer_t espBuffer;
vNetBufferInit(&espBuffer);
uint8_t ucRetvalQueueWifiSta = 0;
uint8_t ucRetvalQueueByte = 0;
while (1)
{
/* code */
TickType_t startTime = xTaskGetTickCount();
while ((xTaskGetTickCount() - startTime) < pdMS_TO_TICKS(3000))
{
ucRetvalQueueWifiSta = xQueueReceive(xQueueUsart2IrqHdlr,
&ucRetvalQueueByte,
pdMS_TO_TICKS(100));
if (ucRetvalQueueWifiSta == pdTRUE)
{
// 将接收到的字节处理到缓冲区
vNetBufferWrite(&espBuffer, (char)ucRetvalQueueByte);
}
}
vTaskDelay(100);
}
}
/**
* @brief 连接WiFi任务
* @note 重置ESP8266模块。
* @param *pvParameters 任务参数,若没有特定的参数则设置为空指针
* @retval None
*/
void vTaskWifiConnection(void *pvParameters)
{
NetFifoBuffer_t espBuffer;
while (1)
{
/* code */
vEsp8266Reset();
if (strstr(espBuffer.cNetFifoBuffer, "ready") != NULL)
{
vUsartSendString(USART3, "WiFi Reset Successfully!\r\n");
vUsartSendString(USART3, espBuffer.cNetFifoBuffer);
vTaskDelay(1000);
break;
} else if (strstr(espBuffer.cNetFifoBuffer, "OK") != NULL)
{
/* code */
vUsartSendString(USART3, "Set WiFi Mode Successfully!\r\n");
vUsartSendString(USART3, espBuffer.cNetFifoBuffer);
} else if (strstr(espBuffer.cNetFifoBuffer, "ERROR") != NULL ||
strstr(espBuffer.cNetFifoBuffer, "FAIL") != NULL)
{
vUsartSendString(USART3, "Error!\r\n");
vUsartSendString(USART3, espBuffer.cNetFifoBuffer);
vUsartSendString(USART3, "\r\n");
break;
}
vTaskDelete(NULL);
}
}