Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 未调用库中的ESP32函数_C++_Arduino_Eclipse Cdt_Esp32 - Fatal编程技术网

C++ 未调用库中的ESP32函数

C++ 未调用库中的ESP32函数,c++,arduino,eclipse-cdt,esp32,C++,Arduino,Eclipse Cdt,Esp32,我正在我的ESP32项目中导入一个lib,它最初是为eclipse设计的,并使用PlatformIO导入到我的代码中,将其放在lib下: 奇怪的行为,如果我激活线路: errn = decode_dinExiDocument(&stream1, &exiDin1); Serial.println("dintest1"); 代码被编译和执行,但函数调用没有输出,甚至行: errn = decode_dinExiDocument(&stream1,

我正在我的ESP32项目中导入一个lib,它最初是为eclipse设计的,并使用PlatformIO导入到我的代码中,将其放在lib下:

奇怪的行为,如果我激活线路:

errn =  decode_dinExiDocument(&stream1, &exiDin1);
Serial.println("dintest1");
代码被编译和执行,但函数调用没有输出,甚至行:

errn =  decode_dinExiDocument(&stream1, &exiDin1);
Serial.println("dintest1");
在函数调用开始时验证方法是否已被调用。
如果我取消对
解码文档的调用
所有内容都正确打印出来。
我有点迷茫,因为我看不到任何调试的方法。有什么想法吗

#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);
}
#包括
#包括
#包括
#包括
#包括
#包括“EXITypes.h”
#包括“dinexidattypes.h”
#包括“dinexidatypesencoder.h”
#包括“DinexiDataTypesCoder.h”
#定义缓冲区大小256
uint8_t buffer1[缓冲区大小];
uint8_t buffer2[缓冲区大小];
静态int din_test1(){
Serial.println(“dintest1”);
int errn=0;
结构dinexidocumentexidin1;
结构dinexidocumentexidin2;
比特流1;
比特流2;
大小\u t pos1=0;
大小\u t pos2=0;
stream1.size=缓冲区大小;
stream1.data=buffer1;
stream1.pos=&pos1;
stream2.size=缓冲区大小;
stream2.data=buffer2;
stream2.pos=&pos2;
/*设置会话请求*/
/*宝马: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;
//如果我进行此调用,则不会调用方法,也不会得到任何输出
errn=解码文档(&stream1,&exiDin1);
Serial.println(errn);
返回错误;
}
无效设置(){
//将安装代码放在此处,以便运行一次:
序列号开始(115200);
}
void循环(){
//将主代码放在此处,以便重复运行:
printf(“+++开始简单DIN测试+++\n”);
int errn=din_test1();
printf(“+++终止简单DIN测试,错误号=%d++\n\n”,错误号);
如果(错误!=0){
printf(“\n测试错误%d!\n”,errn);
}
Serial.println(“新循环”);
延迟(2000年);
}

另外,打印“新循环”的行不会被调用,但会考虑延迟。

如果不知道函数decode\u dinexocument(&stream1,&exiDin1)的作用,就不可能回答您。 我看到该函数来自,并且库目前处于alpha版本。我还注意到开发人员不太喜欢在代码中添加注释

首先,我强烈建议您查看以下链接:

特别是,有函数调用从错误代码中提取字符串并将其重定向到串行端口

发生的是一个致命错误,它会重置微控制器。函数是否可能产生内存泄漏、堆栈溢出或试图访问未初始化的指针

也可能是库内部使用了一些操作系统特定的函数,这些函数试图分配太多内存,或者试图访问某些操作系统特定的代码,而这些代码无法在ESP32上显示

您在哪里为您的结构调用了“init”代码?如果您查看这个标题:您可以很容易地看到有一个init_dinEXIDocument(struct dinEXIDocument*exiDoc);要在使用结构之前调用以初始化结构的函数


作为旁注/个人意见,我永远不会愿意使用一个包含81个未注释和未记录案例的巨型switch语句的函数。

如果不知道函数decode_dinexdocument(&stream1,&exiDin1)的功能,就不可能回答您的问题。 我看到该函数来自,并且库目前处于alpha版本。我还注意到开发人员不太喜欢在代码中添加注释

首先,我强烈建议您查看以下链接:

特别是,有函数调用从错误代码中提取字符串并将其重定向到串行端口

发生的是一个致命错误,它会重置微控制器。函数是否可能产生内存泄漏、堆栈溢出或试图访问未初始化的指针

也可能是库内部使用了一些操作系统特定的函数,这些函数试图分配太多内存,或者试图访问某些操作系统特定的代码,而这些代码无法在ESP32上显示

您在哪里为您的结构调用了“init”代码?如果您查看这个标题:您可以很容易地看到有一个init_dinEXIDocument(struct dinEXIDocument*exiDoc);要在使用结构之前调用以初始化结构的函数

作为旁注/个人意见,我永远不会愿意使用一个包含81个未注释和未记录案例的巨型switch语句的函数。

我解决了这个问题。 代码是正确的。 不幸的是,线程的内存堆分配很低,所以代码挂起

如果有人有类似的问题,我会把答案留在这里

我解决了这个问题。 代码是正确的。 不幸的是,线程的内存堆分配很低,所以代码挂起


如果有人有类似的问题

,这显然是C++代码而不是C代码。也许在
errn=decode\dinExiDocument(&stream1,&exiDin1)中出现了一些严重的错误和程序崩溃。这显然是C++代码而不是C代码。也许在
errn=decode\dinExiDocument(&stream1,&exiDin1)中出现了一些严重的错误和您的程序崩溃。