-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathESP8266.c
148 lines (119 loc) · 3.46 KB
/
ESP8266.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "ESP8266.h"
char ESP_RX_buff[ESP_RX_buff_size];
char ESP_TX_buff[ESP_TX_buff_size];
volatile uint8_t recvByte;
int ESP_RX_buff_index = 0;
UART_HandleTypeDef *ESP8266_huart;
GPIO_TypeDef *ESP8266_PinPort;
uint32_t ESP8266_PinNum;
void ESP8266_SetConfig(UART_HandleTypeDef *huart, GPIO_TypeDef *pinPort, uint32_t pinNum)
{
ESP8266_PinPort = pinPort;
ESP8266_PinNum = pinNum;
ESP8266_huart = huart;
}
void ESP8266_ON()
{
HAL_GPIO_WritePin(ESP8266_PinPort, ESP8266_PinNum, GPIO_PIN_SET);
}
void ESP8266_OFF()
{
HAL_GPIO_WritePin(ESP8266_PinPort, ESP8266_PinNum, GPIO_PIN_RESET);
}
bool ESP8266_Restart()
{
return ESP8266_Send("AT+RST\r\n") && ESP8266_Recv("OK");
}
bool ESP8266_Test(void)
{
return ESP8266_Send("AT\r\n") && ESP8266_Recv("OK");
}
bool ESP8266_EnableEcho()
{
return ESP8266_Send("ATE1\r\n") && ESP8266_Recv("OK");
}
bool ESP8266_DisableEcho()
{
return ESP8266_Send("ATE0\r\n") && ESP8266_Recv("OK");
}
bool ESP8266_DisconnectFromWifi()
{
return ESP8266_Send("AT+CWQAP\r\n") && ESP8266_Recv("OK");
}
char *ESP8266_SendRequest(char *type, char *ip, uint8_t port, char *request)
{
return ESP8266_AT_CIPSTART(type, ip, port) && ESP8266_AT_CIPSEND(strlen(request) + 2) && ESP8266_AT_SendData(request)? ESP_RX_buff: NULL;
}
bool ESP8266_AT_CIPSTART(char *type, char *ip, uint8_t port)
{
sprintf(ESP_TX_buff, "AT+CIPSTART=\"%s\",\"%s\",%d\r\n", type, ip, port);
return ESP8266_Send(ESP_TX_buff) && ESP8266_Recv("OK");
}
bool ESP8266_AT_CIPSEND(int requestLength)
{
sprintf(ESP_TX_buff, "AT+CIPSEND=%d\r\n", requestLength);
return ESP8266_Send(ESP_TX_buff) && ESP8266_Recv("OK");
}
bool ESP8266_AT_SendData(char *request)
{
sprintf(ESP_TX_buff, "%s\r\n", request);
return ESP8266_Send(ESP_TX_buff) && ESP8266_Recv("OK");
}
bool ESP8266_Send(char *command)
{
//return HAL_UART_Transmit_DMA(ESP8266_huart, (uint8_t*)command, strlen(command));
return HAL_UART_Transmit(ESP8266_huart,(uint8_t*)command, strlen(command), 10) == HAL_OK? true: false;
}
bool ESP8266_Recv(char *correctAnswer)
{
uint8_t prevRecvByte = 0;
uint32_t timeout = 10000;
uint32_t time = HAL_GetTick();
ESP8266_ClearRecvBuff();
HAL_UART_Receive_IT(ESP8266_huart, (uint8_t*)&recvByte, (uint16_t)1);
while(HAL_GetTick() - time < timeout)
{
if(prevRecvByte != recvByte)
{
time = HAL_GetTick();
prevRecvByte = recvByte;
}
if(strstr(ESP_RX_buff, correctAnswer) != NULL)
{
HAL_UART_AbortReceive(ESP8266_huart);
return true;
}
//Код задержки
}
return false;
}
void ESP8266_ClearRecvBuff()
{
memset(ESP_RX_buff, 0, ESP_RX_buff_size);
ESP_RX_buff_index = 0;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == ESP8266_huart)
{
ESP_RX_buff[ESP_RX_buff_index++] = recvByte;
HAL_UART_Receive_IT(ESP8266_huart, (uint8_t*)&recvByte, (uint16_t)1);
}
}
bool ESP8266_ConnectTo(char *wifiName, char *password)
{
sprintf(ESP_TX_buff, "AT+CWJAP_CUR=\"%s\",\"%s\"\r\n", wifiName, password);
return ESP8266_Send(ESP_TX_buff) && ESP8266_Recv("OK");
}
bool ESP8266_ConnectToAnyAccessPointFromDefaultList()
{
int accessPointsAmount = sizeof(DefaultAccessPointsList) / sizeof(DefaultAccessPointsList[0]);
for(int i = 0; i < accessPointsAmount; i++)
if(ESP8266_ConnectTo(DefaultAccessPointsList[i].accessPointName, DefaultAccessPointsList[i].accessPointPass))
return true;
return false;
}
char *ESP8266_GetAcceessPoints()
{
return ESP8266_Send("AT+CWLAP\r\n") && ESP8266_Recv("OK")? ESP_RX_buff: NULL;
}