Последовательный ввод NodeMCU V3 приводит к фатальному исключению 9 (LoadStoreAlignmentCause)
Я создаю простой интерфейс в стиле telnet для экспериментальных настроек своего проекта. Я получаю все последовательные выходные данные, отправленные на последовательный порт (и USB на ПК). Код работает нормально, но если я попытаюсь прочитать из Serial или проверю 'Serial.available()', я получу:
Неустранимая ошибка 9 (LoadStoreAlignmentCause)
Определение:
bool pridaj_cely(uint8_t source_from=0, uint8_t line_LCD=0);
Код:
bool Vstup::pridaj_cely(uint8_t source_from, uint8_t line_LCD) {
uint8_t i = 0;
Serial.println(F("one piece input read"));
switch (origin) {
case 0: { //Serial
int16_t znak = -1;
while (Serial.available() < 0) {
Serial.print(F("."));
delay(100);
}
Serial.print(F("Somothing is comming"));
while (Serial.available() > 0) {
celok[i] = Serial.read();
if (i < 12) i++;
}
}
break;
}
return 1;
}
Кодекс Приожения:
bool pripojenie(bool force_it = 0) {
Serial.println(("Beginning connection routine"));
kolo = millis();
while (!WiFi.isConnected()) {
int8_t sieti = WiFi.scanComplete();
Serial.printf("Search result %X", sieti);
switch (sieti) {
case -2:
Serial.println(("\tSearch begins"));
WiFi.scanNetworks(1);
delay(50);
break;
case -1:
Serial.print(("."));
delay(300);
break;
default: //This is the relevant case
Vstup odpoved;
Serial.ciara;
Serial.ciara;
Serial.printf(("Found %X networks"), sieti);
Serial.ciara;
Serial.println();
for (uint8_t i = 0; i < sieti; i++) {
Serial.printf("%d: %s, Kanál:%d (%ddBm) %s\n", i, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i), WiFi.encryptionType(i) == ENC_TYPE_NONE ? "Otvorena" : "");
}
Serial.ciara;
Serial.println(("\nChose network number:"));
odpoved.pridaj_cely(0);
// -------------------Never gets past this one-------
if ((odpoved.Nacislo10() >= 0) && (odpoved.Nacislo10() < sieti)) {
Serial.printf(("Zadaj heslo pre %s\n"), WiFi.SSID(odpoved.Nacislo10()).c_str());
String heslo = Serial.readString();
Serial.print(F("Dostal som "));
for (uint8_t i = 0; i > heslo.length(); i++) Serial.print(heslo[i]);
Serial.println();
Serial.printf(("Vybral som možnosť číslo %d a sieť: "), odpoved.Nacislo10(), WiFi.SSID(odpoved.Nacislo10()).c_str());
//WiFi.begin(WiFi.SSID(odpoved.Nacislo10()).c_str(), heslo);
} else Serial.printf(("Nesprávny výber %d"), odpoved.Nacislo10());
}
}
}
Я прокомментировал все функции, использующие выводы. Исходный код компилируется без проблем.
Я добавляю результат декодера исключений, так как это не помогло мне решить проблему.
Результаты стека декодирования 0x40202a8d: __yield() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 105 0x40202355: Stream::timedRead() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp строка 37 0x40202392: Stream::readString() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp, строка 240 0x402013b6: pripojenie(bool) в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 315 0x40203411: malloc(size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp строка 95 0x40204548: umm_malloc(size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp строка 1685 0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296 0x4020141c: pripojenie_samo(unsigned char) в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 327 0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296 0x40204bb1: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/ xtensa-lx106-elf/include/С++/4.8.2/функциональная строка 2073 0x4020197c: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include /С++/4.8.2/функциональная строка 2300 0x4020e5b8: sys_check_timeouts в строке core/timeouts.c 368 0x40202957: loop_task(ETSEvent*) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 133 0x4020ac9a: __ssputs_r в /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c строка 233 0x40206938: _printf_i в /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf_i.c строка 194 0x4020ac9a: __ssputs_r в /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c строка 233 0x402034b4: malloc_loc(size_t, char const*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp строка 126 0x40204548: umm_malloc(size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp строка 1685 0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296 0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296 0x40204738: umm_realloc(void*, size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp строка 1745 0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 296 0x4020299c: esp_yield() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 91 0x40202f53: задержка (длинный без знака) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp строка 54 0x40201a89: ESP8266WiFiScanClass::scanNetworks(bool, bool, unsigned char, unsigned char*) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp строка 98 0x40203942: uart_write(uart_t*, char const*, size_t) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/uart.cpp строка 498 0x4020299c: esp_yield() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 91 0x40202f53: задержка (длинный без знака) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp строка 54 0x402015fd: loop() в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 460 0x40201410: pripojenie_samo(unsigned char) в /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino строка 325 0x40204bb8: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106- elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/С++/4.8.2/функциональная строка 1934 0x40204ba4: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) в /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/ xtensa-lx106-elf/include/С++/4.8.2/функциональная строка 2069 0x40201e50: HardwareSerial::setDebugOutput(bool) в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/HardwareSerial.cpp строка 79 0x40202a4c: loop_wrapper() в /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp строка 125
строка 325 является функцией-оболочкой, поскольку асинхронное сканирование может вызывать только функцию void определенного типа и вызывает pripojenie_samo(uint8_t бессмысленно)
Серийный вывод: (после перевода на английский язык)
Decoding stack results
0x40202a8d: __yield() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 105
0x40202355: Stream::timedRead() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp line 37
0x40202392: Stream::readString() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/Stream.cpp line 240
0x402013b6: pripojenie(bool) at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 315
0x40203411: malloc(size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp line 95
0x40204548: umm_malloc(size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp line 1685
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x4020141c: pripojenie_samo(unsigned char) at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 327
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x40204bb1: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 2073
0x4020197c: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 2300
0x4020e5b8: sys_check_timeouts at core/timeouts.c line 368
0x40202957: loop_task(ETSEvent*) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 133
0x4020ac9a: __ssputs_r at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c line 233
0x40206938: _printf_i at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf_i.c line 194
0x4020ac9a: __ssputs_r at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdio/nano-vfprintf.c line 233
0x402034b4: malloc_loc(size_t, char const*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/heap.cpp line 126
0x40204548: umm_malloc(size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp line 1685
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x40204738: umm_realloc(void*, size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/umm_malloc/umm_malloc.cpp line 1745
0x402018d8: ESP8266WiFiScanClass::_scanDone(void*, int) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 296
0x4020299c: esp_yield() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 91
0x40202f53: delay(unsigned long) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp line 54
0x40201a89: ESP8266WiFiScanClass::scanNetworks(bool, bool, unsigned char, unsigned char*) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/libraries/ESP8266WiFi/src/ESP8266WiFiScan.cpp line 98
0x40203942: uart_write(uart_t*, char const*, size_t) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/uart.cpp line 498
0x4020299c: esp_yield() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 91
0x40202f53: delay(unsigned long) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_wiring.cpp line 54
0x402015fd: loop() at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 460
0x40201410: pripojenie_samo(unsigned char) at /home/asi/Dropbox/Arduino/hotel_vstup/hotel_vstup.ino line 325
0x40204bb8: std::_Function_base::_Base_manager ::_M_manager(std::_Any_data&, std::_Any_data const&, std::_Manager_operation) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 1934
0x40204ba4: std::_Function_handler ::_M_invoke(std::_Any_data const&, int) at /home/asi/.arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc/2.5.0-3-20ed2b9/xtensa-lx106-elf/include/c++/4.8.2/functional line 2069
0x40201e50: HardwareSerial::setDebugOutput(bool) at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/HardwareSerial.cpp line 79
0x40202a4c: loop_wrapper() at /home/asi/.arduino15/packages/esp8266/hardware/esp8266/2.5.2/cores/esp8266/core_esp8266_main.cpp line 125
ets 8 января 2013, первая причина: 2, режим загрузки: (3,6) загрузка 0x4010f000, длина 1384, комната 16 хвост 8 контрольная сумма 0x2d сумма 0x2d v8b899c12 ~лд SDK:2.2.1(cfd48f3)/Core:2.5.2=20502000/lwIP:STABLE-2_1_2_RELEASE/клей:1.1-7-g82abda3/BearSSL:a143020
@Tomas, 👍-1
Обсуждение1 ответ
Лучший ответ:
Я понял это
Кажется, существуют понятные ограничения, если какая функция может быть запущена в результате асинхронного сканирования (которое, похоже, не прерывает выполнение циклической функции)
Поэтому, если я использовал delay(x)
или цикл while до тех пор, пока не будет введен ввод по последовательному порту, MCU сбрасывается по истечении отведенного времени.
Я переписал код для запуска функции из цикла после завершения сканирования, и теперь все работает нормально.
Я предполагаю, что Arduino не подходит для параллельного программирования
- NodeMCU второй HARDWARE последовательный TX в качестве порта отладки
- Отправка данных из одного узла NodeMCU в другой узел NodeMCU с использованием последовательной связи
- Последовательный монитор ESP8266 выплевывает мусор
- Программирование NodeMCU без USB-порта
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
- AT-команда не отвечает на последовательный монитор
- Разница между этими двумя платами NodeMCU?
декодировать дамп стека исключения. https://github.com/me-no-dev/EspExceptionDecoder, @Juraj
Добавлено, но я не вижу соответствующей информации, просто разочарован тем, что чип содержит полные пути если я закомментирую все Serial-available() и Serial .read(), остальная часть кода будет работать, @Tomas
пути находятся в файле на вашем компьютере. декодирование берет отладочную информацию из файлов, созданных при сборке, но не загруженных в MCU., @Juraj
Спасибо, но проблема осталась, @Tomas
сборка для декодирования совпадала с кодом, который вылетел? дамп стека указывает на сбой в
pripojenie(bool)
, @Jurajpripojenie создает экземпляр класса Vstup (а затем вызывает pridaj_cely для этого экземпляра, которому удается сообщить «прочитанный ввод одной части» в последовательный порт, а затем сбрасывается, как указано выше. То же самое происходит, если код достигает Serial.available() или Serial.read() в других функциях., @Tomas
Я перевел и добавил функцию приположения, в данном случае она вызывается из асинхронного сканирования, @Tomas