Arduino - 代码终止并重启 - SRAM重载?

时间:2017-09-03 10:15:32

标签: arduino

我正在使用Arduino Mega工作四轴飞行器。该项目几乎已经完成了#34;准备好进行试飞,但是......

代码运行初始化SD卡(主文件 - test() - 方法),然后重新启动并运行到最后。

由于我的研究,我遇到了重载SRAM的问题(因为我使用了很多字符串而不是char数组),因此我将几乎所有字符串更改为字符数组。但这并没有解决错误!

错误可能出现在主文件中的 startup() test()方法中,因为代码在此段中终止。 因为问题可能不在一个代码部分,所以这里是指向整个项目的链接(所有文件): https://www.dropbox.com/s/s6vaoi6gnjgz6ek/MulticopterPro_v0.0.6.rar?dl=0

以下是一些代码: 主文件 - 类启动()

void startup(){
  cmd.printMsg(true, msg_startup_start);

  motorControl.batteryDisconnect();

  test();

  // init motor objects
  cmd.printMsg(false, msg_motor_initObjects);
  m1.init();
  m2.init();
  m3.init();
  m4.init();
  cmd.printMsg(true, msg_done);

  // motor speed 0% (=OFF)
  cmd.printMsg(false, msg_motor_speed_off);
  m1.setSpeed(0, false);
  m2.setSpeed(0, false);
  m3.setSpeed(0, false);
  m4.setSpeed(0, false);
  cmd.printMsg(true, msg_done);

  motorControl.batteryConnect();

  // timer (wait or press "O")
  unsigned long timerStarted = millis();
  const byte secondsRemaining_start = 7;
  byte secondsRemaining = secondsRemaining_start;

  cmd.printMsg(true, "[INFO] Press {O} [or wait 7 seconds] to continue");
  while(cmd.readCmd() != 'O'){
    if((millis() - timerStarted) - ((secondsRemaining_start - secondsRemaining) * 1000) >= 1000){
      secondsRemaining--;
      String msg = "[INFO] Press {O} [or wait ";
             msg += secondsRemaining;
      if(secondsRemaining > 1) msg += " seconds] to continue";
      else msg += " second] to continue";

      if(secondsRemaining <= 0) break;

      cmd.printMsg(true, msg);
    }
  }

  // motor speed safe val (=-X%)
  cmd.printMsg(false, msg_motor_speed_safeVal);
  m1.setSpeed(0, true);
  m2.setSpeed(0, true);
  m3.setSpeed(0, true);
  m4.setSpeed(0, true);
  cmd.printMsg(true, msg_done);


  //Werte aus SD auslesen
  //Fehler?

  cmd.printMsg(true, msg_startup_end);
}

主文件 - 班级测试()

void test(){
  cmd.printMsg(false, "Initializing SDcard... ");
  if(sdcard.init()){

    cmd.printMsg(true, "done!");


    cmd.printMsg(true, "Initializing variables from SDcard");

    sdcard.openFile("test.txt", 1);
    String fileContent = sdcard.readFile();
    // !!! automatisch: !!!
    String fileContentLines[2] = {{".RC_receiver#receiver_arm_duration#4000"}, {".RC_receiver#receiver_val#1#-100,100"}};

    for(int i = 0; i < sizeof(fileContentLines); i++){

      // RC_receiver
      if(sdcard.getSectionFromText(fileContentLines[i], 1, '#') == "RC_receiver"){
        cmd.printMsg(false, "RC_receiver#");
        if(sdcard.getSectionFromText(fileContentLines[i], 2, '#') == "receiver_val"){
          cmd.printMsg(false, "receiver_val_");
          String channel = sdcard.getSectionFromText(fileContentLines[i], 3, '#');
          cmd.printMsg(false, channel);
          cmd.printMsg(false, ":");

          String values = sdcard.getSectionFromText(fileContentLines[i], 4, '#');
          String value_01 = sdcard.getSectionFromText(values, 1, ',');
          String value_02 = sdcard.getSectionFromText(values, 2, ',');

          //cmd.printMsg(true, strcat(strcat(strcat(strcat("[", value_01), "] - ["), value_02), "]"));

          //cmd.printMsg(false, strcat(strcat("Setting receiver_val_", channel), "... "));
          if(rc_receiver.setReceiver_val(channel.toInt(), value_01.toInt(), value_02.toInt())){
            cmd.printMsg(true, "done!");
          } else {
            //error - value(s) invalid!!!
            cmd.printMsg(true, "failed!");
            cmd.printMsg(true, "Variable could not be set -> invalid value(s)?");
          }

        } else if(sdcard.getSectionFromText(fileContentLines[i], 2, '#') == "receiver_arm_duration"){

          cmd.printMsg(false, "receiver_arm_duration: ");
          String value = sdcard.getSectionFromText(fileContentLines[i], 3, '#');

          //cmd.printMsg(0, true, "ad");
          //delay(500);
          Serial.println("TEST");

          cmd.printMsg(false, "Setting receiver_arm_duration... ");
          if(rc_receiver.setReceiver_arm_duration(value.toInt())){
            cmd.printMsg(true, "done!");
          } else {
            //error - value(s) invalid!!!
            cmd.printMsg(true, "failed!");
            cmd.printMsg(true, "Variable could not be set -> invalid value(s)?");
          }

        }
      }

    }

  }
  else {
    cmd.printMsg(true, "failed!");
    cmd.printMsg(true, "Failed to initialize SDcard!");
    cmd.printMsg(true, "Please insert SD-card and restart Arduino [or press 'O' to continue]");
    while(cmd.readCmd() != 'O') ;

    cmd.printMsg(true, "Variables couldn't be loaded!");
    cmd.printMsg(true, "Variables must be initialized manually!");
  }
}

如果我忘了什么 - 告诉我,我会发布它!

我感谢任何帮助!

问候安德烈亚斯

0 个答案:

没有答案