问题描述
我正在ESP32项目中导入一个库,该库最初是为eclipse设计的,并使用PlatformIO将其导入到我的代码中,并置于lib下:
奇怪的行为,如果我激活以下行:
errn = decode_dinExiDocument(&stream1,&exiDin1);
代码已编译并执行,但没有从函数调用获得输出,即使是以下行:
Serial.println("dintest1");
在函数调用开始时,以验证方法已被调用。
如果我删除对decode_dinExiDocument
的呼叫,则所有内容都会正确打印。
我几乎没有迷路,因为我看不到任何调试方法。有什么想法吗?
#include <Arduino.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include "EXITypes.h"
#include "dinEXIDatatypes.h"
#include "dinEXIDatatypesEncoder.h"
#include "dinEXIDatatypesDecoder.h"
#define BUFFER_SIZE 256
uint8_t buffer1[BUFFER_SIZE];
uint8_t buffer2[BUFFER_SIZE];
static int din_test1(){
Serial.println("dintest1");
int errn = 0;
struct dinEXIDocument exiDin1;
struct dinEXIDocument exiDin2;
bitstream_t stream1;
bitstream_t stream2;
size_t pos1 = 0;
size_t pos2 = 0;
stream1.size = BUFFER_SIZE;
stream1.data = buffer1;
stream1.pos = &pos1;
stream2.size = BUFFER_SIZE;
stream2.data = buffer2;
stream2.pos = &pos2;
/* SetupSessionReq */
/* BMW: 80 9A 00 11 D0 20 00 03 C1 FC 30 00 43 F8 00 */
buffer1[0] = 0x80;
buffer1[1] = 0x9A;
buffer1[2] = 0x00;
buffer1[3] = 0x11;
buffer1[4] = 0xD0;
buffer1[5] = 0x20;
buffer1[6] = 0x00;
buffer1[7] = 0x03;
buffer1[8] = 0xC1;
buffer1[9] = 0xFC;
buffer1[10] = 0x30;
buffer1[11] = 0x00;
buffer1[12] = 0x43;
buffer1[13] = 0xF8;
buffer1[14] = 0x00;
//if i make this call method is not called and i get no output
errn = decode_dinExiDocument(&stream1,&exiDin1);
Serial.println(errn);
return errn;
}
void setup() {
// put your setup code here,to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here,to run repeatedly:
printf("+++ Start simple DIN test +++\n");
int errn = din_test1();
printf("+++ Terminate simple DIN test with errn = %d +++\n\n",errn);
if(errn != 0) {
printf("\nDIN test error %d!\n",errn);
}
Serial.println("new loop");
delay(2000);
}
也不会调用打印“新循环”的行,但要遵守延迟。
解决方法
如果不知道函式解码_dinExiDocument(&stream1,&exiDin1)的功能,就不可能回答您。 我看到该函数来自https://github.com/mhei/OpenV2G,并且该库目前处于alpha版本。我还注意到开发人员真的不喜欢在代码中添加注释。
首先,我强烈建议您查看以下链接:https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/error-handling.html
特别是,有一些函数调用可以从错误代码中提取字符串并将其重定向到串行端口。
正在发生的是一个致命错误,该错误使您的微控制器复位。您的函数是否可能会产生内存泄漏,堆栈溢出或试图访问未初始化的指针?
库是否有可能在内部使用某些特定于OS的函数来尝试分配过多的内存,或者试图访问某些ESP32上无法存在的特定于OS的代码?
您在哪里为结构调用了“ init”代码?如果查看此标头:https://github.com/mhei/OpenV2G/blob/master/src/din/dinEXIDatatypes.h,您会很容易看到有一个init_dinEXIDocument(struct dinEXIDocument * exiDoc);在使用结构之前调用该函数来初始化结构。
作为旁注/个人观点,我永远不会愿意使用由巨大的switch语句构成的函数,其中包含81个未注释和未记录的情况。
,我解决了问题。 代码是正确的。 不幸的是,线程的内存堆分配很低,因此代码挂起。
如果有人有类似的问题,我将答案留在这里