Проблемы программирования ESP8266 на базе Arduino IDE для ESP8266
Я решил использовать Arduino IDE для ESP8266 для программирования на моем ESP8266 с целью чтения данных (массив байтов с камеры TTL). ESP8266-01 (8 Мбит Flash ROM) имеет 8 контактов, поэтому я решил использовать GPIO16 (TXD) и GPIO2 (RXD) в качестве контактов SoftwareSerial для достижения этой цели. Но ESP8266 напечатал исключение, и я не уверен, что с ним случилось.
Итак, у меня есть несколько вопросов об этой аварии.
Я хочу знать, могу ли я запустить SoftwareSerial на ESP8266 (ESP8266 имеет 2 UART, Serial0 для последовательной печати, и мы не могли отправить данные через Serial1), поэтому я решил использовать SoftwareSerial.
Я не знаю, что означает информация об исключении, потому что я не понимаю язык ассемблера.
Я читаю документы на Github для Arduino IDE для ESP8266, но я плохо понимаю определения выводов на ESP8266 при программировании с Arduino IDE. Например, при использовании GPIO16 (TXD) и GPIO2 (RXD) в качестве SoftwareSerial, мы можем использовать Constructor
SoftwareSerial Camera(int Pin1, int Pin2)
, Я хочу знать, что такое Pin1 и Pin2 для GPIO2 и GPIO16). Документ действительно смутил меня.
Вот мой ключевой код.
#include <Arduino.h>
#include "camera_VC0706.h"
#include <SoftwareSerial.h>
HTTPClient httpClient;
//define camera and bytes array, I am not sure whether the pins are correct or not
int rxPin=2;
int txPin=16;
SoftwareSerial cameraSerial(rxPin,txPin); //RX,TX
camera_VC0706 Camera = camera_VC0706(&cameraSerial);
//take photo
bool takePhoto() {
byte time=0;
writeRawSerial(F("<STATUS>WAITING</STATUS>"),true);
while(!Camera.begin(115200)) {
if(+time<=5){//try 5 times
writeRawSerial(F("."),false);
} else {
writeRawSerial("",true);
writeSerial(F("<STATUS>NO_CAMERA</STATUS>"));
return false;
}
}
writeRawSerial(F("<STATUS>CAMERA_ON</STATUS>"), false);
writeRawSerial(F("<VERSION>"), false);
writeRawSerial(Camera.getVersion(), false);
writeSerial(F("</VERSION>"));
Camera.setImageSize(VC0706_320x240);
if (!Camera.takePicture()) {
writeSerial(F("<STATUS>TAKE_PHOTO_FAIL</STATUS>"));
return false;
} else {
byte imgSize = Camera.frameLength();
writeSerial(F("<STATUS>TAKE_PHOTO_SUCCESS</STATUS>"));
writeRawSerial(F("<IMAGE_SIZE>"),false);
writeRawSerial(String(imgSize,DEC),false);
writeSerial(F("</IMAGE_SIZE>"));
freeHeap();//It was defined, but not key function, only for showing free heap of esp8266
imgBuffer=Camera.readPicture(imgSize);
freeHeap();
Camera.resumeVideo();
writeSerial(F("<STATUS>SAVE_PHOTO_SUCCESS</STATUS>"));
return true;
}
}
Спасибо за чтение моих вопросов.
1 ответ
Таким образом, показанная трассировка стека является довольно стандартной для любой системы и дает вам практически все, что вам нужно для ее отслеживания - это не код сборки, это шестнадцатеричные адреса вашего двоичного файла.
Во-первых, у вас есть исключение 28 - Если мы посмотрим на справочник ESP8266, вы увидите, что 28 означает, что у вас либо неверный указатель, либо вы пытаетесь получить доступ к некэшированным данным из прерывания / кеш отключен.
Далее у вас есть адрес epc1. Здесь происходит сбой кода, который представляет собой шестнадцатеричный адрес загруженного вами двоичного файла. Также полезно ctx: cont, поскольку оно указывает на сбой программы в вашем коде, а не в системном коде.
У вас также есть excvaddr, адрес, к которому вы пытались получить доступ, 0x10.
Учитывая это, у вас почти наверняка есть NULL-указатель где-то в вашем коде, который вы разыменовываете. Вы должны использовать ESP Exception Decoder, чтобы определить, в какой строке происходит сбой и неправильное использование указателя.
Что касается использования серийного программного обеспечения - вы бы просто использовали номера выводов на листе данных. GPIO 14 будет номером 14 в конструкторе. Я обнаружил, что это работает, но вызвало очень странные сбои в продуктах, с которыми я работал после 1+ дней использования, поэтому не рекомендую его вообще. В итоге мы использовали Serial1 для отладочной печати и освободили Serial0 для общих коммуникаций UART - намного надежнее.
Вам нужно добавить стандартные функции Arduino setup() и loop(), иначе он не будет знать, с чего начать.
Если вы посмотрите на примеры скетчей, у вас должно получиться запустить что-то, а затем вы можете начать добавлять свой код takePhoto.