Проблемы программирования ESP8266 на базе Arduino IDE для ESP8266

Я решил использовать Arduino IDE для ESP8266 для программирования на моем ESP8266 с целью чтения данных (массив байтов с камеры TTL). ESP8266-01 (8 Мбит Flash ROM) имеет 8 контактов, поэтому я решил использовать GPIO16 (TXD) и GPIO2 (RXD) в качестве контактов SoftwareSerial для достижения этой цели. Но ESP8266 напечатал исключение, и я не уверен, что с ним случилось.

Отчет о сбое

Итак, у меня есть несколько вопросов об этой аварии.

  1. Я хочу знать, могу ли я запустить SoftwareSerial на ESP8266 (ESP8266 имеет 2 UART, Serial0 для последовательной печати, и мы не могли отправить данные через Serial1), поэтому я решил использовать SoftwareSerial.

  2. Я не знаю, что означает информация об исключении, потому что я не понимаю язык ассемблера.

  3. Я читаю документы на 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.

Другие вопросы по тегам