3

ArduinoUnoで実行しているスケッチが2つあります。最初のファイルは、ファイルが存在する場合はシリアルにダンプします。これはArduinoに付属している例の1つですが、私はそれを次のように変更しました。

/*
    SD card file dump

    This example shows how to read a file from the SD card using the
    SD library and send it over the serial port.

    The circuit:
    * SD card attached to SPI bus as follows:
    ** MOSI - pin 11
    ** MISO - pin 12
    ** CLK - pin 13
    ** CS - pin 4

    Created  22 December 2010 by Limor Fried
    Modified 9 Apr 2012 by Tom Igoe

    This example code is in the public domain.
 */

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;

void setup()
{
    // Open serial communications and wait for port to open:
    Serial.begin(115200);
    while (!Serial) {
        ; // Wait for serial port to connect. Needed for Leonardo only.
    }

    Serial.print("Initializing SD card...");
    // Make sure that the default chip select pin is set to
    // output, even if you don't use it:
    pinMode(10, OUTPUT);

    // See if the card is present and can be initialized:
    if (!SD.begin(chipSelect)) {
        Serial.println("Card failed, or not present");
        // Don't do anything more:
        return;
    }
    Serial.println("card initialized.");

    // Open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    File dataFile = SD.open("datalog.txt");

    // If the file is available, write to it:
    if (dataFile) {
        while (dataFile.available()) {
          Serial.write(dataFile.read());
        }
        dataFile.close();
    }
    // If the file isn't open, pop up an error:
    else {
        Serial.println("error opening datalog.txt");
    }
}

void loop()
{
}

私の他のスケッチはファイルを削除することになっています。この削除スケッチを実行すると、ファイルが見つからないと表示されます。それでも、上記のスケッチを継続的に実行して、内容をシリアルにダンプすることができます。私の削除スケッチは次のとおりです。

#include <SD.h>

const int chipSelect = 4;

void setup(){
    Serial.begin(115200);

    Serial.print("Initializing SD card...");
    // Make sure that the default chip select pin is set to
    // output, even if you don't use it:
    pinMode(10, OUTPUT);

    if(SD.exists("datalog.txt"))
    {
        SD.remove("datalog.txt");
        Serial.println("file removed");
    }
    else
    {
        Serial.println("no file to remove");
    }
}

void loop(){

}

ここで何かが足りませんか?

これを投稿した直後、私はこれをスケッチフォールトトレラントに削除していないことに気付き、次のコードをpinmode行の後に追加しました。

  // See if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
      Serial.println("Card failed, or not present");
      // don't do anything more:
      return;
  }
  Serial.println("card initialized.");

したがって、新しい削除スケッチは次のようになりました。

#include <SD.h>

const int chipSelect = 4;

void setup(){
    Serial.begin(115200);

    Serial.print("Initializing SD card...");
    // Make sure that the default chip select pin is set to
    // output, even if you don't use it:
    pinMode(10, OUTPUT);

    // See if the card is present and can be initialized:
    if (!SD.begin(chipSelect)) {
        Serial.println("Card failed, or not present");
        // Don't do anything more:
        return;
    }
    Serial.println("card initialized.");

    if(SD.exists("datalog.txt"))
    {
        SD.remove("datalog.txt");
        Serial.println("file removed");
    }
    else
    {
        Serial.println("no file to remove");
    }
}

void loop(){

}

そのスケッチを実行すると、ファイルが削除されます。新しいバージョンは機能するのに、古いバージョンは機能しなかったのはなぜですか?

4

1 に答える 1

1

追加SD.begin()してもフォールトトレラントにはなりません。ライブラリを初期化します。他の関数を呼び出す前に、それを呼び出す必要があります。参照から:

begin()SDライブラリとカードを初期化します。これにより、SPIバス(ほとんどのArduinoボードではデジタルピン11、12、および13、Megaでは50、51、および52)とチップセレクトピン(デフォルトではハードウェアSSピン(ほとんどのArduinoではピン10))の使用が開始されます。ボード、メガで53)。

于 2012-11-25T07:46:38.540 に答える