Bonjour,
J'ai un programme qui marchait jusqu'à maintenant et qui plante depuis 3 jours aléatoirement sur le SD.Begin. J'ai soupçonné un dépassement de RAM donc je n'ai laissé que le setup et mon loop vide mais pas mieux.
Je transfert ce code allégé deux trois fois et d'un coup ça remarche. J'ai changé de carte Arduino, d'ethernet shield, de carte SD mais toujours pareil. Lorsque ca remarche je remet tout mon code, ca remarche nickel mais après quelques transferts replantage.
Mon matériel : Arduino mega 2560 , ethernet shield rev3
Ma version de logiciel :Arduino 1.0.3
Auriez vous une idée (je joins mon code allégé au cas où)
//**********************************************************************************************************************************
//**********************************************************************************************************************************
#include <Ethernet.h>
#include <SD.h>
#include <SPI.h>
/* Détails technique de la connexion ethernet */
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
192,168,1, 177 };
byte gateway[] = {
192,168,1, 1 };
// Attachement d'un objet "server"
EthernetServer server(80);
//**********************************************************************************************************************************
//**********************************************************************************************************************************
void setup()
{
// Variables d'Usage
int Resultat_fct = false;
// Initialisation port serie
Serial.begin(115200);
// Affichage de la SRAM utilisée
// Serial.print(F("Memoire SRAM restante :"));
// Serial.println(freeRam());
// Affectation des directions pins
pinMode(53, OUTPUT); // broche de selection WIZNET
pinMode(4, OUTPUT); // broche de selection SD card
digitalWrite(4,LOW);
digitalWrite(53,HIGH);
// Initialisation de la carte SD avec broche 4 en tant que CS
Resultat_fct=SD.begin(4);
if (Resultat_fct!=true)
{
Serial.println(F("Echec initialisation SD!"));
}
// Initialisation de la librairie ethernet
Ethernet.begin(mac, ip, gateway);
server.begin();
}
//**********************************************************************************************************************************
// MAIN
//**********************************************************************************************************************************
void loop()
{
// Scrutation reseau
}
Je mets le code complet (Je débute donc c'est peut être pas très propre smiley-red) mais ce qui me surprend c'est que ce code "allegé" ne marche pas tout de suite. Il faut le transferer 2 ou 3 fois avant que ca remarche...juste transferer 2 ou 3 fois sans rien modifier...
//**********************************************************************************************************************************
//**********************************************************************************************************************************
#include <Ethernet.h>
#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD
#include <SPI.h>
/* Détails technique de la connexion ethernet */
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
192,168,1, 177 };
byte gateway[] = {
192,168,1, 1 };
// Attachement d'un objet "server" sur le port 1337
EthernetServer server(80);
//**********************************************************************************************************************************
//**********************************************************************************************************************************
void setup()
{
// Variables d'Usage
int Resultat_fct = false;
// Initialisation port serie
Serial.begin(115200);
// Affichage de la SRAM utilisée
// Serial.print(F("Memoire SRAM restante :"));
// Serial.println(freeRam());
// Affectation des directions pins
pinMode(53, OUTPUT); // broche de selection WIZNET
pinMode(4, OUTPUT); // broche de selection SD card
digitalWrite(4,LOW);
digitalWrite(53,HIGH);
// Initialisation de la carte SD avec broche 4 en tant que CS
Resultat_fct=SD.begin(4);
if (Resultat_fct!=true)
{
Serial.println(F("Echec initialisation SD!"));
}
delay(1000);
// Initialisation de la librairie ethernet
Ethernet.begin(mac, ip, gateway);
server.begin();
}
//**********************************************************************************************************************************
// MAIN
//**********************************************************************************************************************************
void loop()
{
// Scrutation reseau
Com_reseau();
}
//**********************************************************************************************************************************
// FONCTION COMMUNICATION RESEAU
//**********************************************************************************************************************************
void Com_reseau()
{
//_____________________________________________________________________________________
// Variables d'usage
String chaineRecue=""; // réception chaine requete
int comptChar=0; // comptage des caractères reçus
int resultat_SD=0; // resultat fonction lecture carte SD
int index_paquet=0; // numéro de ligne à lire dans la carte SD
int datas[150]; // ligne lue dans la carte SD
char c; // caractère récupéré par Ethernet
//_____________________________________________________________________________________
// Crée un objet client basé sur le client connecté au serveur
EthernetClient client = server.available();
// si l'objet client n'est pas vide
if (client)
{
// si le client est connecté
if (client.connected())
{
//_____________________________________________________________________________________
// Initialisation variables
comptChar = 0;
chaineRecue = "";
// Boucle sur reception client
while (client.available())
{
// l'octet suivant reçu du client est mis dans la variable c
c = client.read();
// incrémente le compteur de caractère reçus
comptChar=comptChar+1;
// Concatenation caractere dans une chaine dans une limite de 50 caracteres
if (comptChar<50)
{
chaineRecue=chaineRecue+c;
}
}
//_____________________________________________________________________________________
// Chaine reçue est une requete GET alors affichage page Web
if (chaineRecue.startsWith("GET / HTTP"))
{
// Lecture carte SD et affichage page Web
while (resultat_SD!=1 && resultat_SD<100) // Tant que pas fin de fichier texte et pas d'erreur
{
resultat_SD = Lecture_ligne_SD(index_paquet,"/Web/Image.txt",datas);
int idx=0;
while(idx<150 && datas[idx]>0)
{
if (datas[idx]>0)
{
client.print((char)datas[idx]);
idx++;
}
}
index_paquet++;
}
}
//_____________________________________________________________________________________
// Attente et libération client
delay(1);
client.stop();
//_____________________________________________________________________________________
}
}
}
//**********************************************************************************************************************************
// FONCTION DE RECUPERATION D'UNE LIGNE DANS UN FICHIER TXT D'UNE CARTE SD
//**********************************************************************************************************************************
int Lecture_ligne_SD(int index_paquet,char path[20], int tableau[150])
{
//_____________________________________________________________________________________
// Variables d'Usage
int File_exist=0;
File myFile; // objet file
//_____________________________________________________________________________________
// Selection de la SD Card
digitalWrite(53,HIGH);
digitalWrite(4,LOW);
//_____________________________________________________________________________________
// Test si le fichier existe - renvoie true/false
File_exist=SD.exists(path);
// Si fichier n'existe pas
if (File_exist!=true)
{
return 100;
}
// Si fichier existe
else
{
// Ouverture du fichier en lecture
myFile=SD.open(path,FILE_READ);
myFile.seek(index_paquet*150);
for (int index=0;index<=150;index++)
{
tableau[index] = 0;
}
for (int index_c_ec=0;index_c_ec<150;index_c_ec++)
{
tableau[index_c_ec] = myFile.read();
if (tableau[index_c_ec]<0)
{
//tableau[index_c_ec]=0;
return 1;
}
}
return 2;
}
//_____________________________________________________________________________________
// Selection du Wiznet
digitalWrite(53,LOW);
digitalWrite(4,HIGH);
//_____________________________________________________________________________________
}
//**********************************************************************************************************************************
// FONCTION LECTURE SRAM UTILISEE
//**********************************************************************************************************************************
//int freeRam ()
//{
// extern int __heap_start, *__brkval;
// int v;
// return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
//}
Ok je vais faire ça pour bloquer.
Par contre ca pourrait venir de quoi ce probleme ? Une erreur de transfert que je ne vois pas... une librairie pas à jour... c'est quand même étrange.