envoyer des images sur le net a partir d'un microcontroleur

envoyer des images sur le net a partir d'un microcontroleur - C - Programmation

Marsh Posté le 22-08-2003 à 16:54:07    

salut a tous  :hello:  
 
 
J'ai une petite carte munis d'un microcontroleur T89C51 de chez atmel et d'un contrleur ethernet W3100 de chez wiznet.  
Pour envoyer une page sur le net je remplie le buffer d'un header indiquant ce que je vais envoyer precisant la taille ,le tip ,etc.. puis j'envoye ma page ecrite en html .  
 
Le prob maintenant c'est que j'ai une image que j'arrive pas a envoyer ,j'arrive a envoye seulement le debut de l'image car le buffer d'emission ne permet pas de tout envoyer tout en meme temps ,il est trop petit il fait 2KB alors que l'image 5KB sans compter le header.  
 
J'ai essaye de decouper l'image en plusieurs parties et de les envoyer les un apres les autres mais ca marhe pas il prend en compte que le premier paquet ,il doit y avoir des choses a specifier ds l'header pour dire que la suite arrive juste apres .  
 
si quelq'un peut m'aider merci de me repondre.!!!!!! a bientot!!!  :D

Reply

Marsh Posté le 22-08-2003 à 16:54:07   

Reply

Marsh Posté le 22-08-2003 à 17:07:35    

Ca se joue au nivo de TCP ça non ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 25-08-2003 à 09:26:38    

HelloWorld a écrit :

Ca se joue au nivo de TCP ça non ?


 
tu veus dire quoi par la ?

Reply

Marsh Posté le 25-08-2003 à 10:00:15    

Je pige pas comment tu découpes ton image ...
Mes notions de HTTP c'est que t'envoie l'image d'un coup. C'est au niveau de la couche d'en dessous que le découpage a lieu.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-08-2003 à 11:51:21    


 
oueh! mais moi je dois remplir le tampon de transmission qui se trouve sur la carte et dont la taille et de seulement 2KB.Et lorsque j'applique la commande SEND il n'envoi que ce qui ecrit sur le tampon .
Mon image elle fait 3,5 KB donc je doit la decouper car je peux pas tout copier ds le tampon ,il est trop petit.
j'ai decoupé l'image en deux ,ensuite j'ai envoye la premier partie avec le header(avec la methode que je t'ai decrit avt ,tu sais avec le tampon)puis la deuxieme .Au final il n'apparait a l'ecran que la moitie de mon image .
Je pense que la liaison entre la 1ere et la 2° partie se fait mal et qui doit y avoir des trucs a specifier  pour  que cette liaison se passe bien.
 
voici le header que j'envoie avec la 1°partie celle qui s'affiche a l'ecran :
 
<HTTP/1.1 200 OK\r\n
Cache-control: no-cache\n  
Connection: Keep-Alive\n  
Content-Type:image/gif\r\n
Content-Length:3571  //reprensente environ 3,5KB

Reply

Marsh Posté le 26-08-2003 à 12:35:22    

Apparemment, c'est ton contrôleur ethernet qui gère le stack TCP/IP. De plus, selon la datasheet, il propose une API "proche des sockets Windows".
 
Le problème est que TCP ne connait pas de notion de paquets. Il n'y a donc pas de "liaison" entre tes différents envois.
Une fois la connexion établie, on peut écrire et lire dessus comme un flux. Tu peux normalement envoyer 4 fois 32 octets ou 1 fois 128 octets, cela ne fait pas de différence et le receveur peut avoir 2 fois 64 octets. J'aurais donc tendance à faire ce que tu as fait, c'est à dire envoyer en plusieurs fois tes données.
 
Pourquoi cela ne marche pas ?
Il y a peut être un flag que tu dois vérifier avant d'envoyer des données et que tu ne vérifie pas. Quand tu envoie des petits fichiers cela marche car le contrôleur a le temps de tout envoyer avant ta nouvelle requête, mais dans le cas où tu boucles, il n'a pas le temps.
As-tu regardé avec un analyseur de paquets ce qui arrive à ta réception ? Cela permettrait de savoir ce qui est réellement transmis et d'avoir un début d'explication. Par exemple, on ne sait pas si ton deuxième paquet arrive à destination ou pas.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 26-08-2003 à 13:52:37    

Je suis peut être a cote de la plaque mais je comprend pas pkoi ton tampon fait 2Ko seulement.
Je sais qu'il existe un mode de transmission ou tu spécifies pas la taille de ce que tu envoies (ca m'avait posé pblm). Je sais plus quel nom ça porte. Pour dire que c'est fini tu coupes la transmission je crois.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 26-08-2003 à 14:21:43    

HelloWorld a écrit :

Je suis peut être a cote de la plaque mais je comprend pas pkoi ton tampon fait 2Ko seulement.


 
Il utilise un contrôleur ethernet matériel. Or ce contrôleur n'a pas une mémoire illimitée. Ici, apparemment, il n'a que 2ko de mémoire dans le buffer d'envoi.
Pour transmettre des données, il doit remplir le buffer, indiquer dans un registre la taille des données, puis envoyer un signal indiquant que le buffer est rempli et qu'il faut le transmettre. Ce n'est peut être pas ça exactement, mais l'idée y est.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 29-08-2003 à 09:22:22    

gatorette a écrit :

Apparemment, c'est ton contrôleur ethernet qui gère le stack TCP/IP. De plus, selon la datasheet, il propose une API "proche des sockets Windows".


 
 :sol:  
Non ,je ne boucle pas avant d'envoyer le 2° paquet .j'envoie les deux l'un aprés l'autre pdt que la connection est etablie puis ensuite je ferme la connection.
voici le main:
void main()
{
   SOCKET i;
  //c'est un entier qui designe le numero de socket
   int len,x;
   u_char state;
   u_char type;
 
   Init8051();  
//initialisation du microcontroleur
   initW3100A();   //initialisation du controleur Ethernet  
   InitNetConfig();// initialisation des parametres réseau  
 
for (i = 0; i < MAX_SOCK_NUM; i++) init_sock(i);
 
x=0;
while (1)  
{
i = 0;
 for (i = 0; i < MAX_SOCK_NUM; i++)  
  {  
    state=select(i, SEL_CONTROL);
//retourne l'etat de la conect°    
 switch(state)  
  {
    case SOCK_ESTABLISHED :
   //connection etablie
     if ((len = select(i, SEL_RECV)) > 0) //Confirm de reception
       {      
         if (len > MAX_BUF_SIZE)len = MAX_BUF_SIZE
;/*When received data more than system buffer,handle as size as buffer*/
  len = recv(i, rx_buf, len);
  type = ParseReq(rx_buf,x);
/* Analyze request*/
       
  len =PrintHeader(tx_buf ,'g'); //le header
         
 switch (type) /* Transfer web page as for each request */
{
    case 'g':
   /* gif processing*/
//1er ENVOIE:        
len += MSG_Length(tx_buf + len, 3571);//taille du tablo entier
memcpy(tx_buf +len,tab,1800);//1° envoie on remplie le buf  
len += 1800;//la taille de la premiere partie envoyé
len = send(i, tx_buf, len); //on envoie le buf  
//2eme ENVOIE:
memcpy(tx_buf,tab,1900);//2° envoie on recrit par dessus le buf  
len = 1900;//la taille de la 2° partie envoyé
len = send(i, tx_buf, len); //on envoie la deuxieme partie  
 
 break;
       
}
}
break;
   case SOCK_CLOSE_WAIT :
 /* Terminate connection*/
printf("CLOSE_WAIT : %bd\r\n", i);
close(i);
/* SOCKET CLOSE*/
 break;
     case SOCK_CLOSED :
/* Close conneciton*/
 printf("CLOSED : %bd\r\n",i);
 init_sock(i);      
 break;
   }
  }
/*for*/
} /* while*/  
}


Message édité par rachton le 29-08-2003 à 09:28:42
Reply

Marsh Posté le 29-08-2003 à 09:54:39    

rachton a écrit :

Non ,je ne boucle pas avant d'envoyer le 2° paquet .j'envoie les deux l'un aprés l'autre pdt que la connection est etablie puis ensuite je ferme la connection.


 
Essaie de regarder dans la datasheet si tu n'as pas à attendre un événement particulier avant de pouvoir envoyer le deuxième paquet.
 
Essaie également de mettre ton code dans des balises [ cpp], ce sera plus clair.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 29-08-2003 à 09:54:39   

Reply

Marsh Posté le 29-08-2003 à 10:38:22    

gatorette a écrit :


 
Essaie de regarder dans la datasheet si tu n'as pas à attendre un événement particulier avant de pouvoir envoyer le deuxième paquet.
 
Essaie également de mettre ton code dans des balises [ cpp], ce sera plus clair.


En tout cas je te le confirme je viens de vérifier ,lorsque j'envoie les 2 paquets la connection est bien ouverte meme quand j'envoie la 2° partie

Reply

Marsh Posté le 29-08-2003 à 11:40:26    

Citation :

j'envoie les deux l'un aprés l'autre pdt que la connection est etablie puis ensuite je ferme la connection.


 
Donc ça écarte mon idée de problème HTTP. Ca serait bien "plus bas nivo".


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 30-08-2003 à 18:04:36    

j'ai longement reflechi et je crois que le probleme viens du buffer qui ne veut pas se vider,donc quand je recris sur le buffer pour la 2°partie ca doit pas marcher car le buffer n'est pas vidé.  
Deplus je rencontre un probleme avec le buffer de réception egalement.  
Et le gros probleme c'est que je peux pas visualiser le contenu des buffers ,personne n'a un logiciel ou une idée pour visualiser les buffers d'un microcontroleur ou d'un controleur Ethernet?


Message édité par rachton le 10-09-2003 à 11:52:44
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed