ESP8266基于Arduino IDE的ESP8266编程问题

时间:2018-03-16 09:22:01

标签: arduino esp8266 arduino-esp8266

我决定使用Arduino IDE for ESP8266在我的ESP8266上编程,目标是读取数据(来自TTL摄像机的字节数组)。 ESP8266-01(8Mbits Flash ROM)有8个引脚,因此我决定使用GPIO16(TXD)和GPIO2(RXD)作为SoftwareSerial引脚来实现这一目标。但ESP8266打印了一个例外,我不确定它发生了什么。

The crash report

所以我对这次崩溃有一些疑问。

  1. 我想知道我是否可以在ESP8266上运行SoftwareSerial(ESP8266有2个UART,Serial0用于串行打印,我们无法通过Serial1发送数据),所以我决定使用SoftwareSerial。

  2. 我不知道异常信息对我无法理解汇编语言意味着什么。

  3. 我在Github上阅读了针对ESP8266的Arduino IDE的文档,但在使用Arduino IDE进行编程时,我对ESP8266的引脚定义并不了解。例如,当使用GPIO16(TXD)和GPIO2(RXD)作为SoftwareSerial时,我们可能会使用构造函数SoftwareSerial Camera(int Pin1, int Pin2)。我想知道GPIO2和GPIO16的相应Pin1和Pin2是什么。该文件让我很困惑。

  4. 这是我的密码。

    #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;
      }
    }
    

    感谢您阅读我的问题。

2 个答案:

答案 0 :(得分:1)

您需要添加setup()和loop()的标准Arduino函数,否则它将不知道从哪里开始。

如果您查看示例草图,则应该能够运行某些内容,然后就可以开始添加takePhoto代码了。

答案 1 :(得分:0)

因此,显示的堆栈跟踪对于任何系统都是非常标准的,并且它为您提供了跟踪它所需的几乎所有内容 - 它不是汇编代码,它是二进制文件的十六进制地址。

首先,你有一个例外28 - 如果我们查看ESP8266 Reference,你可以看到28意味着你有一个坏指针,或者你试图从一个中断访问非缓存数据/ cache已关闭。

接下来,你有一个地址,epc1。这是代码崩溃的地方,它是您上传的二进制文件的十六进制地址。另外,ctx:cont很有用,因为它表示程序在代码中崩溃而不是系统代码。

您还有excvaddr,这是您尝试访问的地址,0x10。

鉴于此,您几乎肯定在代码中的某个位置有一个NULL指针,您正在解除引用。您应该使用ESP异常解码器来确定哪个行有令人讨厌的崩溃和错误的指针使用。

关于使用软件序列 - 您只需使用数据表中的引脚编号即可。 GPIO 14在构造函数中将是14。我发现它有效,但在我使用1天以上的生产产品中造成了非常奇怪的崩溃,所以不要推荐它。我们最终使用Serial1进行调试打印,并释放Serial0用于一般UART通信 - 方式更可靠。