Ошибка отправки данных из ESP8266 в Uno
Я отправляю данные с ESP8266 в Uno (мне нужно использовать Uno, потому что у него больше входных данных, чем у ESP, и они нужны мне для моего проекта). ESP8266 подключается к последовательным контактам Uno 0/1 RX / TX (обмен данными со скоростью передачи данных 9600 бод), а затем у меня есть программный пакет от Uno (со скоростью передачи данных 57600 бод) для отладки. Однако происходит что-то странное. Передача выполняется пару раз, а затем я получаю это в журнале:
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
Exception (0):
epc1=0x40239ba1 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
>>>stack>>>
ctx: sys
sp: 3fffebd0 end: 3fffffb0 offset: 0190
3fffed60: 40239b2e 3feffe00 3fffd9d0 00000050
3fffed70: 000005e0 00000000 40103501 3ffed4d0
3fffed80: 0000003c 00000000 00000022 401049e6
3fffed90: 401049c8 3fffc100 3ffef2a0 00000000
3fffeda0: 00000000 4022279f 00000020 40100198
3fffedb0: 400005e1 150cc636 00000005 4010144c
3fffedc0: 4022279f 00000030 00000010 3ffefdcc
3fffedd0: 40221007 3fff051a 00000014 00000000
3fffede0: 00000000 00000061 00000061 00000001
3fffedf0: 3ffecdb8 00000006 00000000 3fff04fc
3fffee00: 3fff051a 3ffef2a0 00000061 00000000
3fffee10: 3ffe9be8 7fffffff 50800000 00000001
3fffee20: 00000001 00004a08 00000142 401006d7
Есть какие-нибудь идеи, что может быть причиной этого? Вот код, который Uno использует для получения от ESP и печати в SoftwareSerial (Serial - это RX / TX, а mySerial - это SoftwareSerial). Он использует пару вспомогательных функций, которые я здесь не включил, но дайте мне знать, если они вам понадобятся:
void receiveFromESP() {
if (Serial.available() > 0 ) {
endofTransmission == 0;
alreadyZeroed = 0 ;
receivedChar = Serial.read();
mySerial.print(receivedChar);
if (receivedChar == '[' ) {
lastNum = 0 ;
commaNumber = 0 ;
lastWasNum = 0 ;
}
if (receivedChar == '*' ) {
lastNum = 0 ;
commaNumber = 0 ;
lastWasNum = 0 ;
createArray[0] = 4;
createArray[1] = 4;
createArray[2] = 4;
createArray[3] = 4;
}
if (receivedChar == 'A'
|| receivedChar == 'B'
|| receivedChar == 'C'
|| receivedChar == 'D'
|| receivedChar == 'E'
|| receivedChar == 'F'
|| receivedChar == 'G'
|| receivedChar == 'H'
|| receivedChar == 'I'
|| receivedChar == 'J'
|| receivedChar == ','
) {
if (lastWasNum == 1) {
createArray[commaNumber] = lastNum;
commaNumber++;
}
lastWasNum = 0 ;
createArray[commaNumber] = charToNumber(receivedChar);
commaNumber++;
lastNum = 0 ;
}
if (receivedChar == ']') {
lastWasNum = 0 ;
endofTransmission = 1 ;
for (int i = 0; i < 50; i++) {
mySerial.print(createArray[i]);
mySerial.print(':');
}
}
if (
receivedChar == '0'
|| receivedChar == '1'
|| receivedChar == '2'
|| receivedChar == '3'
|| receivedChar == '4'
|| receivedChar == '5'
|| receivedChar == '6'
|| receivedChar == '7'
|| receivedChar == '8'
|| receivedChar == '9'
) {
lastWasNum = 1;
receivedCharInt = (int)receivedChar - 48;
lastNum = lastNum * 10 + receivedCharInt;
}
t = millis();
}
};
В соответствии с запросом, вот полный код ESP:
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <DNSServer.h> //Локальный DNS-сервер, используемый для перенаправления всех запросов на портал конфигурации
#include <ESP8266WebServer.h> //Локальный веб-сервер, используемый для обслуживания портала конфигурации
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager Магия настройки Wi-Fi
#define SERIAL_BUFFER_SIZE 256
void setup() {
Serial.begin(9600);
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("*WIFISETUP] WAIT %d...\n", t);
Serial.flush();
delay(1000);
}
WiFiManager wifiManager;
wifiManager.setConfigPortalTimeout(120);
//первый параметр - это имя точки доступа, второй - пароль
wifiManager.autoConnect("AP-NAME", "AP-PASSWORD");
}
void loop() {
WiFiClient client;
HTTPClient http;
if (http.begin(client, "[URL]")) { // HTTP
// запустите соединение и отправьте HTTP-заголовок
http.addHeader("Content-Type", "text/plain");
http.addHeader("Authorization", "Basic dXNlcm5hbWU6cGFzc3dvcmQ=");
int httpCode = http.GET();
if (httpCode == 200 ) { // HTTP-заголовок был отправлен, и заголовок ответа сервера был обработан
// файл, найденный на сервере
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = http.getString();
Serial.println(payload);
}
} else{
if (httpCode > 0 ){
//проблема с сайтом
Serial.printf("[2,1,1,1]");
}
if (httpCode == -1 ){
//проблема с wifi
Serial.printf("[4,1,1,1]");
ESP.reset();
}
}
http.end();
} else {
Serial.printf("[HTTP} Unable to connect\n");
}
delay(10000);
}
@garson, 👍0
Обсуждение1 ответ
Почему бы не использовать плату расширения PCF8574 I2C, они отлично работают на 3V3. Если вам нужно больше входов или выходов, используйте PCF8575. Существует множество плат расширения I2C, которые вы можете выбрать. Они также будут быстрее и менее запутанными, чем ваше существующее решение.
Ответ на вопрос "почему бы и нет" звучит так: "Я никогда раньше не слышал о платах I2C". Пожалуйста, простите мне недостаток знаний и мои запутанные решения, поскольку я новичок в этом. Я был бы признателен вам за помощь в решении проблемы, которую я потратил время, чтобы изложить в этом посте. Спасибо., @garson
Попробуйте зайти на ebay и поискать "Модули I2C", я получил более 7000 просмотров. Исключение, которое вы получаете, относится к ESP8266. Устраните задержку (), и ваш сбой должен исчезнуть. В Интернете есть много сообщений о том, почему бы вам не использовать его. Кстати, вы не очень четко изложили свою проблему, вы просто опубликовали много кода. Я погуглил ESP8266 Exception (0): и получил это в качестве первого попадания: https://www.espressif.com/sites/default/files/documentation/esp8266_reset_causes_and_common_fatal_exception_causes_en.pdf, @Gil
Я перенастроил код, чтобы использовать millis() вместо delay(). Я все еще сталкиваюсь с тем же сообщением об ошибке. Пожалуйста, дайте мне знать, если есть проблемы, которые я мог бы лучше объяснить в своем посте - я стараюсь быть полезным и предоставить всю информацию, которую я могу., @garson
Как насчет того, чтобы показать схему? Обязательно покажите заземляющие соединения в том виде, в каком вы их подключили. Вы могли бы немного подробнее рассказать о скорости передачи данных в бодах и о том, как заставить последовательный отладчик работать с softwareserial., @Gil
- AT-команда не отвечает на последовательный монитор
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Повреждение данных SoftwareSerial - поиск предложений
- Можно ли использовать SoftwareSerial в ESP01
- Проблемы с последовательной связью между Arduino и ESP8266.
- Исправление последовательной связи, условие доступности последовательных данных проверяется даже после считывания всех отправленных данных.
- Как использовать 2 последовательных порта, когда библиотека WifiEsp использует один из обоих
используйте плагин stack decoder IDE для декодирования стека. сбой происходит в коде esp, поэтому код Uno - это не то, что нам нужно видеть, @Juraj
Спасибо, сейчас я изучаю плагин stack decoder IDE. Чтобы было ясно, я вижу это в журнале SoftwareSerial, выходящем из Uno. Могу я спросить, откуда вы знаете, что сбой произошел в коде esp? Спасибо, @garson
Я видел это много раз. Uno не создает дамп стека, а "ВЫРЕЗАТЬ ЗДЕСЬ ..." - это шутка разработчиков esp8266 arduino, @Juraj
Я подключаю только ESP к своему компьютеру, чтобы просмотреть журнал. ESP отправляет данные каждые 30 секунд, поэтому я предполагаю, что там тоже произойдет сбой, и я также проверю плагин stack decoder IDE. (ESP отправляется на 9600, а SoftwareSerial - на 57600.), @garson
"ESP отправляет сообщение на 9600, а SoftwareSerial - на 57600". ???, @Juraj
Я добавил уточнение о скорости передачи данных в бодах к тексту вопроса., @garson
Разместив свой код ESP, вы, вероятно, столкнулись с переполнением буфера где-то в вашем ESP. Кстати, используйте
if (receivedChar >= '0' && receivedChar <= '9')
было бы намного проще для вашего кода Arduino., @hcheungЯ добавил код ESP, @garson