i have a random Problem.
i'am writing an array of 512 bytes (or 1024, 2048) to a SD Card in SPI Mode.
Sometimes (randomly) 2 of these Blocks are swapped
You can see the swapped blocks in the picture

Code: Select all
FILE* f = fopen(c, "a"); // IDF FS
if (f == NULL/*!file*/) {
Serial.println("- failed to open file for appending");
sd_error = true;
write_error(ERRORSDCARD, "SD Card LOGFILE", "Could not open file");
readtemp = readcounter; // Fehler: readtemp zurücksetzen
}
else {
/*for (uint16_t i = 0; i < copycounter; i++) { // Kopiere den RAM-Buffer in den Write Buffer
write_buf[i] = RAM_Buf[readcounter];
readcounter ++; // zähle readcounter hoch
if (readcounter == RAMSIZE) { // Buffer Overflow
readcounter = 0; // Overflow ausgleichen
}
}*/
int fileerror;
fileerror = fwrite(write_buf, 1, copycounter, f); // Schreibe Write Buffer auf SD Karte -> dauert etwas...
yield(); // RTOS -> Zeit für andere Tasks
//Serial.print("fileerror fwrite: ");
//Serial.println(fileerror);
if (fileerror != copycounter) { // normalerweise rückgabewert = copycounter
// ToDo: readcounter zurückrechnen -> overflow beachten (readtemp verwenden)
readtemp = readcounter; // Fehler: readtemp zurücksetzen
ErrorCode = ErrorCode | ERRORSDCARD;
write_warning(String(fileerror), "Log File Write error");
}
fileerror = fflush(f); // endgültig schreiben
Filewritecounter++; // Debugcounter -> ToDo: nur wenn erfolgreich?
//Serial.print("fileerror fflush: ");
//Serial.println(fileerror);
if (fileerror != 0) { // normalerweise ok
// ToDo: readcounter zurückrechnen -> overflow beachten (readtemp verwenden)
readtemp = readcounter; // Fehler: readtemp zurücksetzen
ErrorCode = ErrorCode | ERRORSDCARD;
write_warning(String(fileerror), "Log File Flush error");
}
//file.close(); // Arduino FS
fileerror = fclose(f); // IDF FS
//Serial.print("fileerror fclose: ");
//Serial.println(fileerror);
if (fileerror != 0) { // normalerweise ok
// ToDo: readcounter zurückrechnen -> overflow beachten (readtemp verwenden)
readtemp = readcounter; // Fehler: readtemp zurücksetzen
ErrorCode = ErrorCode | ERRORSDCARD;
write_warning(String(fileerror), "Log File Close error");
}
readcounter = readtemp; // Wenn alles OK wird readcounter um 512Byters erhöht; Wenn fehler wbleibt readcounter so wie zuvor,
fileerror = 0;
Is there an issue with ffwrite?