基于Arduino的ESP8266编程问题 IDE for ESP8266
Problems on ESP8266 programming based on Arduino IDE for ESP8266
我决定使用 Arduino IDE for ESP8266 在我的 ESP8266 上编程,目标是读取数据(来自 TTL 相机的字节数组)。 ESP8266-01(8Mbits Flash ROM)有 8 个引脚,所以我决定使用 GPIO16(TXD)和 GPIO2(RXD)作为软件串行引脚来实现这一点。但是ESP8266打印出一个异常,我不确定它发生了什么。
所以我对这次崩溃有几个问题。
我想知道我是否可以在 ESP8266 上 运行 SoftwareSerial(ESP8266 有 2 个 UART,Serial0 用于串行打印,我们无法通过 Serial1 发送数据),所以我决定使用软件序列号.
不懂汇编语言,不知道异常信息是什么意思
我阅读了关于Github for Arduino IDE for ESP8266 的文档,但我对使用 Arduino 编程时 ESP8266 上的引脚定义不太了解 IDE.例如,当使用 GPIO16 (TXD) 和 GPIO2 (RXD) 作为 SoftwareSerial 时,我们可能会使用 Constructor SoftwareSerial Camera(int Pin1, int Pin2)
。我想知道GPIO2和GPIO16对应的Pin1和Pin2)是什么。文档真让我迷惑。
这是我的关键代码。
#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;
}
}
感谢您阅读我的问题。
所以,显示的堆栈跟踪对于任何系统来说都是非常标准的,它为您提供了跟踪它所需的几乎所有内容 - 它不是汇编代码,它是二进制文件的十六进制地址。
首先,你有一个异常 28 - 如果我们查看 ESP8266 Reference,你会看到 28 意味着你有一个错误的指针,或者你正在尝试访问来自 non-cached 的数据interrupt/cache 已关闭。
接下来,您有一个地址,epc1。这是代码崩溃的地方,它是您上传的二进制文件的十六进制地址。另外,ctx: cont 很有用,因为它表示程序在您的代码中崩溃,而不是在系统代码中崩溃。
您还有 excvaddr,这是您尝试访问的地址,0x10。
鉴于此,您几乎可以肯定在要取消引用的代码中某处有一个 NULL 指针。您应该使用 ESP 异常解码器来确定哪一行有违规的崩溃和错误的指针使用。
关于使用软件序列号 - 您只需使用数据表上的引脚号即可。 GPIO 14 将是构造函数中的编号 14。我发现它有效,但在使用 1 天以上后导致我使用的生产产品出现非常奇怪的崩溃,所以根本不推荐它。我们最终使用 Serial1 进行调试打印,并释放 Serial0 用于一般 UART 通信——更可靠。
您需要添加 setup() 和 loop() 的标准 Arduino 函数,否则它将不知道从哪里开始。
如果您查看示例草图,您应该能够得到一些东西 运行,然后您可以开始添加您的拍照代码。
我决定使用 Arduino IDE for ESP8266 在我的 ESP8266 上编程,目标是读取数据(来自 TTL 相机的字节数组)。 ESP8266-01(8Mbits Flash ROM)有 8 个引脚,所以我决定使用 GPIO16(TXD)和 GPIO2(RXD)作为软件串行引脚来实现这一点。但是ESP8266打印出一个异常,我不确定它发生了什么。
所以我对这次崩溃有几个问题。
我想知道我是否可以在 ESP8266 上 运行 SoftwareSerial(ESP8266 有 2 个 UART,Serial0 用于串行打印,我们无法通过 Serial1 发送数据),所以我决定使用软件序列号.
不懂汇编语言,不知道异常信息是什么意思
我阅读了关于Github for Arduino IDE for ESP8266 的文档,但我对使用 Arduino 编程时 ESP8266 上的引脚定义不太了解 IDE.例如,当使用 GPIO16 (TXD) 和 GPIO2 (RXD) 作为 SoftwareSerial 时,我们可能会使用 Constructor
SoftwareSerial Camera(int Pin1, int Pin2)
。我想知道GPIO2和GPIO16对应的Pin1和Pin2)是什么。文档真让我迷惑。
这是我的关键代码。
#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;
}
}
感谢您阅读我的问题。
所以,显示的堆栈跟踪对于任何系统来说都是非常标准的,它为您提供了跟踪它所需的几乎所有内容 - 它不是汇编代码,它是二进制文件的十六进制地址。
首先,你有一个异常 28 - 如果我们查看 ESP8266 Reference,你会看到 28 意味着你有一个错误的指针,或者你正在尝试访问来自 non-cached 的数据interrupt/cache 已关闭。
接下来,您有一个地址,epc1。这是代码崩溃的地方,它是您上传的二进制文件的十六进制地址。另外,ctx: cont 很有用,因为它表示程序在您的代码中崩溃,而不是在系统代码中崩溃。
您还有 excvaddr,这是您尝试访问的地址,0x10。
鉴于此,您几乎可以肯定在要取消引用的代码中某处有一个 NULL 指针。您应该使用 ESP 异常解码器来确定哪一行有违规的崩溃和错误的指针使用。
关于使用软件序列号 - 您只需使用数据表上的引脚号即可。 GPIO 14 将是构造函数中的编号 14。我发现它有效,但在使用 1 天以上后导致我使用的生产产品出现非常奇怪的崩溃,所以根本不推荐它。我们最终使用 Serial1 进行调试打印,并释放 Serial0 用于一般 UART 通信——更可靠。
您需要添加 setup() 和 loop() 的标准 Arduino 函数,否则它将不知道从哪里开始。
如果您查看示例草图,您应该能够得到一些东西 运行,然后您可以开始添加您的拍照代码。