Bonjour, j'ai un "petit" soucis lors de la tentative d'ouverture de fichier (sur la SD d'un sheild W5500 sur Arduino Méga) afin d'envoyer le dis contenu du fichier à mon serveur FTP.
Si le nom du fichier sur la SD fait moins de 8 caractères utiles (ex: NOV2023.csv soit 7 utiles +le point +3 de type = 11 + encore le caractère de terminaison de String =12) c'est OK !
Mais si le nom du fichier sur la SD fait 13 caractères en tout du genre : NOVE2023.csv ce qui est le maximum autorisé par le système de l'Arduino là j'ai un échec d'ouverture du dit fichier!
Voici le code dont je me sers:
#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xFE, 0xBA };
IPAddress ip( 192, 168, 0, 32 );
IPAddress serverMoi(192, 168, 1, 78);
EthernetClient clientserveur;
EthernetClient dclient;
char outBuf[512];
char outCount;
#define pinCS_SD 4 // on réserve le Pin 4 pour le lecteur de SD
#define pinCS_ETH 10 // on affecte le pin 10
Sd2Card card; // création de l'objet Sd nommé card
File file;
String nomfichier= "Anemo1.txt";
String nompiecejointe = "DECE2023.CSV";
boolean piecejointe =1;
int nb =0;
String repFTPinput = "/"; // dossier homedir du serveur
void setup()
{
Serial.begin(9600);
delay(1000);
Serial.println(F("debut"));
pinMode(53, OUTPUT); //carte Mēga pour pouvoir accéder en même temps à la SD et à Ethernet doit être activé
pinMode(pinCS_SD, OUTPUT);
/*Test pour voir si la carte SD fonctionne */
if (!card.init(SPI_HALF_SPEED, pinCS_SD)) {
Serial.println(F("Pb carte "));
}
else {Serial.println(F("Montage correct et carte présente")); }
Serial.println(F("on attaque ethernet"));
digitalWrite(pinCS_SD,HIGH);// pour activer ethernet sur un Uno et mega
Ethernet.init(pinCS_ETH);
delay(2000);
int erreur = 0; // initialise la variable d'erreur de démarrage du Shield Ethernet
erreur = Ethernet.begin(mac); // On tente de démarrer le Shield Ethernet SANS adresse IP (donc donnée via DHCP de la box)
if (erreur == 0) {
Ethernet.begin(mac, ip); // forcage de l'adresse ip si pas acquise par box
Serial.println(F("on a mis une IP fixe"));;
}
if (SD.begin(pinCS_SD)) {
file = SD.open(nomfichier,FILE_READ);
if(file == 0)
{
Serial.println(F("Echec ouverture SD pour lecture dans le setup"));
}
else{
Serial.println(F("SD ouverte pour le téléchargement"));
}
file.close();
Serial.println(F("SD fermée"));
}
else { Serial.println(F("la Sd ne demarre pas"));}
Serial.println(F("fin du setup"));
} // fin du setup
//fonctions
byte eRcv()
{
byte respCode;
byte thisByte;
while(!clientserveur.available()) delay(1);
respCode = clientserveur.peek();
outCount = 0;
while(clientserveur.available())
{
thisByte = clientserveur.read();
Serial.write(thisByte);
if(outCount < 511)
{
outBuf[outCount] = thisByte;
outCount++;
outBuf[outCount] = 0;
}
}
if(respCode >= '4')
{
efail();
return 0;
}
return 1;
}
void efail()
{
byte thisByte = 0;
clientserveur.println(F("QUIT"));
while(!clientserveur.available()) delay(1);
while(clientserveur.available())
{
thisByte = clientserveur.read();
Serial.write(thisByte);
}
clientserveur.stop();
Serial.println(F("Commande de déconnexion"));
file.close();
Serial.println(F("SD fermée"));
}
byte FTPopen()
{
Serial.println(F(" "));
Serial.println(F("Connexion FTP -----------------"));
if (clientserveur.connect(serverMoi,21)) {
Serial.println(F("connectée"));
}else {
file.close();
Serial.println(F("Echec de la commande de connexion"));
return 0;
}
if(!eRcv()) return 0;
clientserveur.println(F("USER mails"));
if(!eRcv()) return 0;
clientserveur.println(F("PASS Gilles54"));
if(!eRcv()) return 0;
clientserveur.println(F("SYST"));
if(!eRcv()) return 0;
clientserveur.println(F("PASV"));
if(!eRcv()) return 0;
char *tStr = strtok(outBuf,"(,");
int array_pasv[6];
for ( int i = 0; i < 6; i++) {
tStr = strtok(NULL,"(,");
array_pasv[i] = atoi(tStr);
if(tStr == NULL)
{
Serial.println(F("Mauvaise réponse PASV "));
}
}
unsigned int hiPort,loPort;
hiPort = array_pasv[4] << 8;
loPort = array_pasv[5] & 255;
Serial.print(F("Port de donnée: "));
hiPort = hiPort | loPort;
Serial.println(hiPort);
if (dclient.connect(serverMoi,hiPort)) {
Serial.println(F("connecté"));
}else {
Serial.println(F("Echec de connexion"));
clientserveur.stop();
// file.close();
return 0;
}
delay(200);
}
byte FTPupload(String fileName)
{
Serial.println(F("Téléchargement -----------------------"));
Serial.println(fileName);
if (SD.begin(pinCS_SD)) {
file = SD.open(fileName,FILE_READ);
if(file == 0)
{
Serial.println(F("Echec ouverture SD pour lecture"));
}
else{
Serial.println(F("SD ouverte pour le téléchargement"));
Serial.print(F("chemin sur serveur : "));
Serial.println(repFTPinput+fileName);
}
clientserveur.print(F("STOR "));
clientserveur.println(repFTPinput+fileName);
}
if(!eRcv())
{ Serial.print(F("stop dclient "));
dclient.stop();
return 0;
}
char clientBuf[BUFSIZ];
int clientCount = 0;
while(file.available())
{
clientBuf[clientCount] = file.read();
clientCount++;
if(clientCount > BUFSIZ-1)
{
dclient.write(clientBuf,BUFSIZ);
clientCount = 0;
}
}
if(clientCount > 0) dclient.write(clientBuf,clientCount);
Serial.println(F("Fichier téléchargé"));
delay(200);
return 1;
}
byte FTPclose()
{
Serial.println(F("Fermeture FTP -----------------------"));
dclient.stop();
Serial.println(F("Données déconnectées"));
if(!eRcv()) return 0;
clientserveur.println(F("QUIT"));
if(!eRcv()) return 0;
clientserveur.stop();
Serial.println(F("commande de deconnexion"));
file.close();
Serial.println(F("SD fermée"));
Serial.println(F("--------------------------------"));
}
// la boucle
void loop()
{
nb=nb+1;
if (nb <=1 ){
if(FTPopen() == 0) { // Ouverture du serveur FTP
FTPopen();
}
if (piecejointe == 1 ){Serial.print(F("envoie avec piece jointe : "));
Serial.println(nompiecejointe);
FTPupload (nompiecejointe); // copie de la piece jointe de la Sd sur le serveur
FTPclose(); // fermeture du serveur ftp
if(FTPopen() == 0) { // Ouverture du serveur FTP
FTPopen();
}
FTPupload (nomfichier); // copie du fichier de la Sd sur le serveur
}
else {FTPupload (nomfichier); }// copie du fichier de la Sd sur le serveur
}
FTPclose(); // fermeture du serveur ftp
} // fin de la boucle
Donc dans cette exemple ci dessus j'obtiens lors de l'exécution dans le moniteur série échec ouverture SD pour le fichier DECE2023.csv si je met DEC2023.csv c'est tout bon (bien entendu sous réservé d'avoir un fichier de ce nom sur la SD!)
PS: la partie serveur FTP n'est pas de moi elle vient de ce site!
Merci