strcpy() and/or strcat() 挂起 Arduino Uno

strcpy() and/or strcat() hangs Arduino Uno

我有一个 Arduino Uno V3。我正在处理的草图有几个全局变量,其中存储了一个目录中的文件,我想在 Adafruit Music Maker shield 上播放该文件。一切都很好,只要我只想在实例化时播放 vars 中引用的文件,但是当我在需要修改这些 char 数组的地方调用我的函数时,我的程序或 Arduino 挂起或崩溃。

这些是我的变量:

// mp3 player variables
boolean plrStartPlaying = false;              // Is set to true in case an nfc tag is present with information on tracks to play
char plrCurrentFile[13] = "track001.mp3";     // which track is the player playing?
char plrCurrentFolder[9] = "system00";        // from which directory is the player playing?
char filename[23] = "/system00/track001.mp3"; // path and filename of the track to play
byte firstTrackToPlay = 1;                    // the track number as received from the tag
char curTrackCharNumber[4] = "001";

这是我调用来修改它们的函数:

// stores the file to play in the global var filename - it is created from the gloal vars plrCurrentFolder and plrCurrentFile
boolean createFileNameToPlay(byte trackNo) {
  // fill global var curTrackCharNumber with provided trackNo - we need it next to create the global var plrCurrentFile
  sprintf(curTrackCharNumber, "%03d", trackNo);

  // create the name of the track to play from the curTrack
  strcpy(plrCurrentFile[0], '[=12=]');
  strcat(plrCurrentFile, "track");
  strcat(plrCurrentFile, curTrackCharNumber);
  //strcat(plrCurrentFile, sprintf(plrCurrentFile, "%03d", trackNo));
  strcat(plrCurrentFile, ".mp3");

  // create the filename of the track to play, including path, so we can feed it to the music player
  strcpy(filename[0], '[=12=]');
  strcat(filename, "/");
  strcat(filename, plrCurrentFolder);
  strcat(filename, "/");
  strcat(filename, plrCurrentFile);
  if (SD.exists(filename)) {
    return (true);
  } else {
    return (false);
  }
}

如前所述,它不起作用 - 我通过注释掉函数中的所有 strcat()strcpy() 调用进行检查,然后我的程序运行正常。但如果代码处于活动状态,它实际上会导致我的 Arduino 挂起或程序崩溃。不管是什么原因,结果是我的程序一旦调用这个函数就不会前进,并且在一定时间后,Arduino 会重置。

有人可以向我解释为什么会这样吗?

您尝试使用 strcpy() 将字符复制到字符,而不是将字符指针复制到字符指针 — 问题出现(至少)两次:

strcpy(plrCurrentFile[0], '[=10=]');
…
strcpy(filename[0], '[=10=]');

这应该会产生编译器错误;两个参数都应该是 char *,但都不是 char *。写入:

plrCurrentFile[0] = '[=11=]';
…
filename[0] = '[=11=]';

或:

strcpy(plrCurrentFile, "");
…
strcpy(filename, "");

您为什么不注意编译器警告?如果您至少没有收到警告,为什么不呢?找到创建此类警告所需的选项,最好将它们变成错误。例如,对于 GCC,请考虑:

gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …

这是我的基本选项;我不会 运行 使用这些选项编译不干净的代码。我有时会添加更多。