Est ce qu'il y a des incompatibilités ou des choses spécifiques à faire pour faire fonctionner à la fois le shield internet et la carte SD?
J'utilise le même code d'exemple sans initialiser le serveur intenet placé :
dans le setup avec un loop à vide ca fonctionne sans
dans le loop avec un delay ca fonctionne aussi
mais placé dans une fonction avec mon serveur ca ne fonctionne plus.
Ca plante soit sur le SD.begin() soit le card.init().
Si j’écris une fonction qui envoie du code html du type Serial.println("<doctype... ca fonctionne aussi.
je vous met mon bout de code mais c'est le classique des samples des fois que j'ai fais une ENORME coquille...
#include <SD.h>
#include <Ethernet.h>
#define MYDEBUG
void ReadHttp(EthernetClient client,char *fileName)
{
#ifdef MYDEBUG
Serial.println(fileName);
#endif
pinMode(10, OUTPUT);
// see if the card is present and can be initialized:
if (!SD.begin(4))
{
Serial.println("Card failed, or not present");
// don't do anything more:
return;
}
#ifdef MYDEBUG
Serial.println("Apres SD.BEGIN");
#endif
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
File dataFile = SD.open(fileName);
#ifdef MYDEBUG
Serial.println("Apres SD.open");
#endif
// if the file is available, write to it:
if (dataFile)
{
while (dataFile.available())
{
client.write(dataFile.read());
}
dataFile.close();
}
// if the file isn't open, pop up an error:
else
{
Serial.println("error opening file");
}
} // fin de ReadHttp
J'avais commencé par ca. mais la compréhension que j'ai de ce post (celui de skizoh) c'est que l'on utilise soit la carte SD soit l'internet et qu'une écriture du type client.write(dataFile.read()); n'est pas possible.
j'ai rajouté le pinMode(4, OUTPUT) qu'il me manquait et ce ne fonctionne pas mieux
Je suis en arduino1.0.1
Oui ca marche separement:
J'ai fait un module pure internet avec des print pour envoyer du http et ca fonctionne (mais on sature vite en memoire ...)
J'ai repris les samples de la SD et ca fonctionne aussi. C'est quand je relie les 2 que ca merdoit...
et un 3eme avec le readHttp (lit un fichier http sur la carte et envoi au client.
L'include de la SD.h dans les 3 fichiers provoque des violations de mémoire
je m'en suis rendu compte lorsque j'ai intégré le SD.begin() dans le setup. La carte était du coup correctement détectée mais, dès que j’accédais au serveur arduino par firefox ca me remettait les traces du setup... bizarre bizarre
J'ai effectivement viré la partie bas niveau(cardinfo) pour quand je serais grand et puis ce n’était pas nécessaire dans mon projet et j'ai réintégré mon readhttp dans le fichier principal... du coup ca roule
Je ne connais pas bien c++ mais c'est normal cette déclaration de SD ou c'est mal pensé?
Soit tu travailles exclusivement avec SD comme dans les exemples fournis avec l'IDE (excepté CradInfo qui utilise les libs bas niveau)
Soit tu travailles avec les libs de bas niveau (Sd2Card/SdVolume/SdFile) comme dans SDWebbrowse
+1 Ne surtout pas mélanger les deux librairies bas niveau (SDfatlib) et haut niveau (SD) tu manqueras obligatoirement de mémoire et tu auras des erreurs de RESET, ou autre.
gerse:
L'include de la SD.h dans les 3 fichiers provoque des violations de mémoire
je m'en suis rendu compte lorsque j'ai intégré le SD.begin() dans le setup. La carte était du coup correctement détectée mais, dès que j’accédais au serveur arduino par firefox ca me remettait les traces du setup... bizarre bizarre
Violation de mémoire -> Ok mais comment le sait tu ? En est tu sur ? (sur un microcontrôleur une violation de mémoire ça veut tout et rien dire à la fois)
Le reset à la connexion ça sent le manque de RAM à plein nez !
Quand la librairie SD est initialisé il te reste environ 500 octets de ram disponible (enfin un peu moins de 400 en réalité vraiment utilisable).
Avec ton code source sous les yeux ce serait plus facile de t'aider
gerse:
Je ne connais pas bien c++ mais c'est normal cette déclaration de SD ou c'est mal pensé?
C'est une déclaration extern tout ce qui a de plus classique.
C'est juste que tu as foiré un truc quelque par
C'est juste que tu as foiré un truc quelque par smiley-wink
Je veux bien te croire
Pour en finir j'ai juste réintégrer mon code dans un seul fichier et supprimer la partie CardInfo.. Cette dernière action a dut résoudre le pb.
Je vais ressayer de séparer mon code en 2 fichiers demain pour voir si ca tombe toujours en marche et pour ma comprehension. En plus j'ai encore 2 / 3 trucs à ameliorer (en particulier le traitement des images) et je mettrais ca dans les projets...
S