Compare commits

..

4 commits

Author SHA1 Message Date
72dc48807d perf(serial): aumentar velocidad del puerto a 2.000.000 baudios
Se eleva la tasa de transferencia del puerto Serie al máximo régimen estable soportado por el microcontrolador (2 Mbps). Esta optimización reduce drásticamente el tiempo de bloqueo de la CPU al imprimir mensajes de depuración, liberando ciclos de reloj que son vitales para garantizar la lectura ininterrumpida del bus CAN y soportar la futura carga de la pila Wi-Fi/UDP.
2026-02-23 15:57:34 +01:00
c446873682 perf(sd): unificar escritura de variables con snprintf
Se reemplazan las múltiples llamadas secuenciales a _logFile->print() por la construcción de una cadena de texto única en la RAM mediante snprintf. Esta refactorización minimiza las operaciones de escritura sobre el bus SPI, reduce la latencia de guardado en la SD y prepara la función flushToSD() para escalar a múltiples variables del vehículo sin riesgo de bloquear los ciclos de CPU del microcontrolador.
2026-02-23 15:55:32 +01:00
9072c162df fix(sd): añadir sync en la creacion de las cabeceras 2026-02-23 13:22:45 +01:00
95c4c51c07 fix(.ino): Funcion size SdFat 2026-02-23 13:15:35 +01:00
3 changed files with 16 additions and 11 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/settings.json

View file

@ -17,7 +17,7 @@ CAN can_interface;
DataProcessor processor; DataProcessor processor;
void setup() { void setup() {
Serial.begin(115200); Serial.begin(2000000);
delay(1000); delay(1000);
Serial.println("\n--- G26 TELEMETRY: INICIO DE SISTEMA ---"); Serial.println("\n--- G26 TELEMETRY: INICIO DE SISTEMA ---");
@ -28,8 +28,9 @@ void setup() {
if (logFile.open("G26.csv", O_RDWR | O_CREAT | O_APPEND)) { if (logFile.open("G26.csv", O_RDWR | O_CREAT | O_APPEND)) {
// Si el archivo es nuevo (tamaño 0), escribimos la cabecera // Si el archivo es nuevo (tamaño 0), escribimos la cabecera
if (logFile.size() == 0) { if (logFile.fileSize() == 0) {
logFile.println("Time,ECT"); logFile.println("Time,ECT");
logFile.sync();
} }
// El archivo se queda abierto y listo. // El archivo se queda abierto y listo.

View file

@ -150,18 +150,19 @@ void DataProcessor::flushToSD() {
// Verificamos que los punteros existan Y que el archivo esté abierto // Verificamos que los punteros existan Y que el archivo esté abierto
if (_sd && _logFile && _logFile->isOpen()) { if (_sd && _logFile && _logFile->isOpen()) {
// 1. Escribimos al BUFFER (RAM) - Esto es instantáneo (microsegundos) // 1. ESTRUCTURACIÓN EN RAM (El método snprintf)
_logFile->print(millis()); // Reservamos 128 bytes de memoria temporal.
_logFile->print(","); char buffer[128];
_logFile->println(car.ect);
// Ensamblamos la cadena en la RAM. snprintf devuelve la longitud real de la cadena.
int len = snprintf(buffer, sizeof(buffer), "%lu,%d\n", millis(), car.ect);
_logFile->write(buffer, len);
// 2. SYNC CONTROLADO // 2. SYNC CONTROLADO
// Solo obligamos a la tarjeta a "escribir de verdad" si ha pasado X tiempo.
// Esto evita detener el CAN cada 10ms.
if (millis() - _last_sync_time > _sync_interval_ms) { if (millis() - _last_sync_time > _sync_interval_ms) {
_logFile->sync(); // Aquí sí gastamos tiempo, pero solo 1 vez por segundo _logFile->sync();
_last_sync_time = millis(); _last_sync_time = millis();
// Serial.println("[SD] Sync realizado"); // Descomentar solo para debug
} }
} }
} }