envoyer des images sur le net a partir d'un microcontroleur - C - Programmation
Marsh Posté le 22-08-2003 à 17:07:35
ReplyMarsh Posté le 25-08-2003 à 09:26:38
ReplyMarsh 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.
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
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.
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.
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.
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". |
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*/
}
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.
Marsh Posté le 29-08-2003 à 10:38:22
gatorette a écrit : |
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
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".
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?
Marsh Posté le 22-08-2003 à 16:54:07
salut a tous
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!!!