我运行下面的代码并检查序列,看它是否只打印"初始化SD卡"然后输入"完成SD"然后停止
完整代码:
#include <SPI.h>
#include <SD.h>
#define SD_PIN 10 //Pin at CS
#define BUZZER_PIN 3
#define TEMP_PIN A2
File sampletext;
int tempVoltage;
int celsius;
char *fileName;
void setup()
{
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
while(!Serial)
{
delay(100); // Wait to open a Serial
}
Serial.println("Initializing SD card...");
if (!SD.begin(10))
{
Serial.println("Failed SD card");
return;
}
Serial.println("Done SD card");
sprintf(fileName, "%s_%s.txt", __DATE__, __TIME__);
sampletext = SD.open(fileName, FILE_WRITE);
if(!sampletext)
{
Serial.println("Failed to write to file");
return;
}
Serial.println("Setup Done. Exit Serial to close program");
}
void loop()
{
if(!Serial)
{
sampletext.close();
return;
}
tempVoltage = analogRead(TEMP_PIN);
celsius = ((tempVoltage/1024.0)*5000)/10;
sampletext = SD.open(fileName, FILE_WRITE);
sampletext.println(__DATE__ );
sampletext.print(__TIME__ );
sampletext.print("Temp = ");
sampletext.print(celsius);
sampletext.print("C");
}
奇怪的是,它应该完全打印&#34;完成SD卡&#34;但是停了一半。我已经尝试过固定编码选项,但它不起作用。
我的解决方案是什么
答案 0 :(得分:0)
sprintf
之后的print("Done SD card")
是垃圾内存,因为您没有声明任何空格来接收文件名字符:
char *fileName;
这是一个指向某个内存的指针,它被初始化为0.所以sprintf
正在将文件名字符写入地址0. Urk。
只需声明一个足够大的数组来保存完整的文件名:
char fileName[32];
此数组声明也可以作为char *
参数传递给sprintf
。但是,您应该使用知道何时停止写入的sprintf
变体:
snprintf(fileName, sizeof(fileName), "%s_%s.txt", __DATE__, __TIME__);