DrJarold
Member
ESP работает в режиме моста UDP-UART-UDP. Фактически просто пробрасывая сообщения с порта UDP на Serial Arduino ожидая пока та ответит и возвращает ответ в UDP. Вот код:
При коротких запросах по типу:
Все работает как часы... Но если попытаться отправить более длинное сообщение к примеру:
Тут же получаю краш модуля и его перезагрузку, после чего он перестает принимать сообщения на UDP порт, нужно передергивать питание.
В логах ошибка:
Даже не знаю куда смотреть? Неужели переполнение буфера UART?
Код:
#define MAX_BUFFER 1000
#define UTC3 10800 //UTC+3
#define DELAY_MESSAGE_UPDATE 10000
#define DELAY_NTP_UPDATE 3600000 // 10 minutes
unsigned long timeIP, lastNTPtime, currentNTPtime;
bool NTPState = false;
bool WIFI_ENABLE = false;
byte MAX_TIMERS = 8;
byte MAX_TEMP_SENSOR = 4;
bool isWaitResponse = false;
bool isError = false;
bool isSettingsApply = false;
unsigned int localUdpPort = 8888;
char incomingPacket[MAX_BUFFER];
int NTP_ADDR = 102;
int AUTO_CONNCT_ADDR = 104;
int MAX_TIMERS_ADDR = 106;
int MAX_TEMP_SENSOR_ADDR = 108;
void setup() {
timeIP = millis();
lastNTPtime = millis();
Serial.begin(9600);
Serial.setRxBufferSize(2048);
delay(DELAY_MESSAGE_UPDATE);
SendWiFiLog("WiFi:Init complete..");
String response = GetPreferenseFromArduino();
if (response.indexOf(SETTINGS) != -1) {
SendWiFiLog("WiFi:Load config...");
if (SetNewPreferenceFromArduino(response)) {
if (Connection()) {
indexNTPServer = 0;
sendNTPpacket();
}
} else {
SendWiFiLog("WiFi:Error config...");
}
} else {
SendWiFiLog("Couldn't get config");
isError = true;
SendWiFiLog("WiFi:Error...");
}
}
byte indexWait = 0;
void loop() {
isWaitResponse = false;
if (WIFI_ENABLE && !isError) {
if (WiFi.status() == WL_CONNECTED) {
int packetSize = Udp.parsePacket();
if (packetSize) {
int len = Udp.read(incomingPacket, MAX_BUFFER);
if (len > 0) {
if (len > MAX_BUFFER) { len = MAX_BUFFER;}
incomingPacket[len] = 0;
}
isWaitResponse = CheckRequestSimpleCommand(incomingPacket);
for (int i = 0; i < MAX_BUFFER; i++) {
incomingPacket[i] = 0x0;
}
if (!isWaitResponse) {
return;
}
}
}
}
indexWait = 0;
while (Serial.available() <= 0 && isWaitResponse) {
delay(10);
indexWait++;
if (indexWait > 100) {
break;
}
}
indexWait = 0;
String response = "";
if (Serial.available() > 0) {
while (Serial.available()) {
response += Serial.read();
delay(1);
}
if (response.indexOf(SETTINGS) != -1 && !isSettingsApply) {
isSettingsApply = true;
SendWiFiLog("WiFi:Load config...");
if (SetNewPreferenceFromArduino(response)) {
if (Connection())
sendNTPpacket();
} else {
SendWiFiLog("WiFi:Error config...");
}
isSettingsApply = false;
} else {
/*
Если это не настройки для ESP8266 значит это ответ на запрос от Arduino
Отправляем его на UDP
*/
SendResponseSuccess(response);
}
} else {
/*
Если флаг isWaitResponse все еще активен значит данные не были получены за интервал времени
*/
if (isWaitResponse) {
SendResponseError(RESPONSE_NOT_RESPONSE);
}
}
if (millis() > timeIP + DELAY_MESSAGE_UPDATE) {
if (WIFI_ENABLE && !isError) {
SendWifiIp(false, false);
} else {
SendWiFiLog(lastMessage, false);
}
timeIP = millis();
}
if (millis() > lastNTPtime + DELAY_NTP_UPDATE) {
indexNTPServer = 0;
lastNTPtime = millis();
sendNTPpacket();
}
}
bool CheckRequestSimpleCommand(String inString) {
if (inString.indexOf(GET_COMMAND) != -1) {
SendToSerial(inString, true);
return true;
} else if (inString.indexOf(POST_COMMAND) != -1) {
if (inString.indexOf(F("data")) == -1) {
SendResponseError(RQUEST_DATA_CORUPTED);
return false;
}
if (inString.indexOf(F("time_NTP")) != -1) {
SendToSerial(inString, true);
SendResponseError(RQUEST_COMPLETE);
// we don't wait response from arduino when we try set time on device
return false;
}
SendToSerial(inString, true);
return true;
} else if (inString.indexOf(INFO_COMMAND) != -1) {
SendToSerial(inString, true);
SendResponseError(RQUEST_COMPLETE);
// we don't wait response from arduino when we try sent info
return false;
}
return false;
}
Код:
{"status":"get","message":"device"}
{"status":"get","message":"canal_state"}
{"status":"get","message":"timer_daily_state"}
Код:
{"status":"post","message":"canal_state","data": {"canal":[1,1,1,1,1,1,1,1],"canal_timer":[2,1,1,1,1,1,1,1]}}
В логах ошибка:
Код:
Exception (3):
epc1=0x401003e9 epc2=0x00000000 epc3=0x00000000 excvaddr=0x400083a1 depc=0x00000000
ctx: sys
sp: 3ffffd40 end: 3fffffb0 offset: 01a0
>>>stack>>>
3ffffee0: ffffffff 3ffee884 3fff18c0 3fffdab0
3ffffef0: 00000000 3fffdad0 3fff083c 00000019
3fffff00: 402169d8 00000000 00000064 401004d8
3fffff10: 3fff0758 0000018f 0000018f 40106c7c
3fffff20: 3fff1f10 3fff1f0c 05d73913 40216859
3fffff30: 3fff1f10 3fff1f0c 05d73913 402169ed
3fffff40: 3ffef7a0 12b087c6 60000600 40216b29
3fffff50: 402169d8 00000000 00000001 4020aef5
3fffff60: 40231164 3ffef778 3ffef7a0 60000600
3fffff70: 12b126ea 3ffef7a0 3ffef778 40231171
3fffff80: 402311b6 3fffdab0 00000000 3fffdcb0
3fffff90: 3ffef7b0 3fffdad0 3fff083c 4020ae8f
3fffffa0: 40000f49 3ffea5a0 3fffdab0 40000f49
<<<stack<<<
Exception 3: LoadStoreError: Processor internal physical address or data error during load or store
Decoding 16 results
0x401003e9: _umm_malloc at C:\Users\Doc\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1382
0x402169d8: udp_input at /Users/ivan/e/arduino-esp8266/tools/sdk/lwip/src/core/udp.c line 398
0x401004d8: malloc at C:\Users\Doc\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266\umm_malloc/umm_malloc.c line 1664
0x40106c7c: pvPortMalloc at C:\Users\Doc\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\cores\esp8266/heap.c line 40
0x40216859: udp_input at /Users/ivan/e/arduino-esp8266/tools/sdk/lwip/src/core/udp.c line 398
0x402169ed: udp_input at /Users/ivan/e/arduino-esp8266/tools/sdk/lwip/src/core/udp.c line 398
0x40216b29: udp_sendto_if at /Users/ivan/e/arduino-esp8266/tools/sdk/lwip/src/core/udp.c line 398
0x402169d8: udp_input at /Users/ivan/e/arduino-esp8266/tools/sdk/lwip/src/core/udp.c line 398
0x4020aef5: BufferDataSource::available() at C:\Users\Doc\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi\src\include/DataSource.h line 29
0x40231164: system_adc_read at ?? line ?
0x40231171: system_adc_read at ?? line ?
0x402311b6: system_adc_read_fast at ?? line ?
0x4020ae8f: __exchange_and_add_single at c:\users\doc\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\ext/atomicity.h line 68
: (inlined by) __exchange_and_add_dispatch at c:\users\doc\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\ext/atomicity.h line 86
: (inlined by) std::_Sp_counted_base(__gnu_cxx::_Lock_policy)0>::_M_release() at c:\users\doc\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/shared_ptr_base.h line 141
: (inlined by) std::__shared_count(__gnu_cxx::_Lock_policy)0>::~__shared_count() at c:\users\doc\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2\xtensa-lx106-elf\include\c++\4.8.2\bits/shared_ptr_base.h line 546