Je viens de tester la librairie AltSoftSerial. Les tests de base sont bien plus concluant.
Malheureusement, maintenant je tombe d'autre soucis sur ma fonction de log :
Les tous premiers essais de log avait été réalisés avec ce module :
http://www.cooking-hacks.com/index.php/shop/arduino/microsd-2gb-module-for-arduino.htmlEt pour écrire sur la carte SD, j'avais cette routine qui donnait satisfaction :
// Enregistrement sur carte SD
if (currentTime > (sdTime + 20000) ) { // 50Hz (20000)
char dataString[ ] = "0000000000;000;000;000;000;000;000";
unsigned long valRC = sdTime/1000;
for(int i = 0; valRC > 0 && i < 10; i++){
int val = valRC % 10;
// ne pas oublier que les tableaux commencent à l'indice 0!!!
dataString[9 - i] = 48 + val;
valRC /= 10;
}
for (int voieRC=0;voieRC<6;voieRC++){
//Serial.print(map(rcData[voieRC], 900, 2200, 0, 179));
int valRC = map(rcData[voieRC], 900, 2200, 0, 179);
for(int i = 0; valRC > 0 && i < 3; i++){
int val = valRC % 10;
// ne pas oublier que les tableaux commencent à l'indice 0!!!
dataString[13 + voieRC * 4 - i] = 48 + val;
valRC /= 10;
}
}
File dataFile = SD.open(stringFile, FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.println(dataString);
dataFile.close();
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
sdTime = currentTime;
}
currentTime = micros();
}
Maintenant que je suis passé sur OpenLog, la routine est la même sauf pour la partie finale :
void writeSD(){
if (currentTime > (sdTime + 100000) ) { // 50Hz (20000)
char dataString[ ] = "0000000000;000;000;000;000;000;000";
// Log le temps
unsigned long valRC = sdTime/1000;
for(int i = 0; valRC > 0 && i < 10; i++){
int val = valRC % 10;
// ne pas oublier que les tableaux commencent à l'indice 0!!!
dataString[9 - i] = 48 + val;
valRC /= 10;
}
// Log les données RC
for (int voieRC=0;voieRC<6;voieRC++){
//Serial.print(map(rcData[voieRC], 900, 2200, 0, 179));
int valRC = map(rcData[voieRC], 900, 2200, 0, 179);
for(int i = 0; valRC > 0 && i < 3; i++){
int val = valRC % 10;
// ne pas oublier que les tableaux commencent à l'indice 0!!!
dataString[13 + voieRC * 4 - i] = 48 + val;
valRC /= 10;
}
}
// Envoi des données à OpenLog
String currentDataString = dataString;
mySerial.println(currentDataString);
Serial.println(currentDataString);
sdTime = currentTime;
}
}
Les données reçues via le moniteur sont cohérentes :
...
0000010201;085;085;126;085;021;082
0000010301;085;084;126;085;022;082
0000010401;085;085;125;085;021;082
0000010501;085;086;126;085;020;082
0000010601;085;086;126;085;020;082
0000010701;085;085;125;085;021;082
0000010801;085;084;126;085;021;082
0000010901;085;085;125;085;021;082
0000011001;086;084;126;085;022;082
...
Par contre les données enregistrées sur la cart SD sont illisibles avec des caractères NULL à ne plus en finir... J'ai changé la fréquence d'enregistrement sans succès.
Même ce code ne marche pas :
#define versionOpenLog "Rc_Log_20130127"
#include <AltSoftSerial.h>
AltSoftSerial mySerial; // RX=pin8, TX=pin9
#define SOFTSERIAL_COM_SPEED 57600 // Faire correspondre avec le contenu du fichier CONFIG.TXT de la carte SD
...
mySerial.begin(9600);
mySerial.println("Essai");
mySerial.println(versionOpenLog);
J'ai repris les codes qui fonctionnait, j'ai donc essayé ça (au cas où les string soient mal traitées) :
// Envoi des données à OpenLog
//mySerial.println(dataString); Ne fonctionne pas!!
for (int i = 0; i < sizeof(dataString) - 1; i++) mySerial.print(dataString[i]);
Serial.println(dataString);
Et là, encore une fois, je sèche...

Est-ce qu'il y a encore une incompatibilité avec le reste du code?....
Faut-il repasser en Serial Hardware avec les pins D0 et D1? J'ai cru comprendre qu'il fallait les laisser libre pour la communication PC. Sachant que ce projet n'est pas destiné à être connecté à un PC, quels sont les risques?...
Merci pour votre aide...
Olivier