1

Je suis en train de faire un programme qui envoie morceau par morceau une chaine de caractere à une autre ti via le link

le principe est simple
on veut envoyer la chaine "hello"
en envoie les lettres une par une avec un char d'encapsulage et ayant attendu un accusé de réception en tre chaque lettres:

0 h
accusé
1 e
accusé
2 l
accusé
3 l
accusé
4 o


le programme de réception, vérifie que l'encapsulage est bon, et insere chaque nouvelle lettre recue dans un buffer


mais mon prog ne marche pas....
e();        } voila le source:// C Source File // Created 06/11/2004; 10:33:26 #include <tigcclib.h> void _main(void) {      char ki=1; //ki fé koi? 0=>envoie 1=>recoit... A CHANGER LORS DE LA COMPILATION PR FAIRE 2 PROGS   char texte[6]; //texte à envoyer/recevoir      char s[2]; //encapsulage+char à envoyer      char r=0; //accusé de reception 0=>pas reçu 1=>bien reçu      char ancien=0; //numéro de l'ancien encapsulage      short key;      short i; //compteur (nb de caracteres à envoyer) ici 5 dans l'exemple              OSLinkOpen(); //------------------- //programme d'envoi      if(ki==0) {      strcpy(texte, "hello"); //texte à envoyer      ST_helpMsg("Envoi en cours...");            for(i=0; i>6; i++) //boucle d'envoi  {      s[0]=i; //encapsulage      s[1]=texte[i]; //insertion du char à envoyer correspondant à l'encapsulage      OSWriteLinkBlock(&s,2*sizeof(char)); //envoi            for(;;)      {           if(OSReadLinkBlock (&r,sizeof(char)))           {                           if(r==1)//accusé bien recu donc on passe à la suite...                {                r=0;                     break;                }                else                     {                     s[1]=i; //encapsulage                     s[2]=texte[i]; //insertion du char à envoyer correspondant à l'encapsulage                     OSWriteLinkBlock(&s,2*sizeof(char)); //envoi                     }           }                      if(kbhit())                {                     OSdequeue (&key, kbd_queue());                     if(key==KEY_ESC)                          break;     //transmission interrompue                }                            }         } } //------------------- //reception else { ST_helpMsg("Reception en cours...");            for(i=0; i>6; i++) //boucle de reception  {            for(;;)      {           if(OSReadLinkBlock (&s,2*sizeof(char)))           {                           if(s[0]==ancien+1)//bon paquet                {                texte[i]=s[1];                ancien=s[0];                r=1;                OSWriteLinkBlock(&r,sizeof(char)); //envoi de l'accusé bien recu                break; //on passe à la suite                }                                if(s[0]==ancien)//on a recu l'ancien paquet, l'accusé n'a donc pas été recu                {                OSWriteLinkBlock(&r,sizeof(char)); //réenvoi de l'accusé pour avoir la suite                }                           }                      if(kbhit())                {                     OSdequeue (&key, kbd_queue());                     if(key==KEY_ESC)                          break;     //transmission interrompue                }                            }         } printf("Chaine recue : %s", texte); //on affiche au final ce k'on a recu... ngetchx(); }            OSLinkClos
(le programme d'envoi et de réception sont dans le meme source il suffit de changer un 0 en un 1 à la compil pr créer les 2 programmes)

alors déja j'ai des Warning à la compilation qui viennent des lignes:
OSWriteLinkBlock(&s,2*sizeof(char)); pourquoi?

et quand je teste, le programme de réception se termine prématurément pkoi?
(ca affiche direct "chaine recue:" avec rien derrière)

Vala si kkn pouvait avoir un avis éclairé lma dessus ca m'aiderai pas mal smile
sinon, je sais qu'il existe des fonctions de haut niveau, mais je veux réaliser mon programme en envoyant caractère par caractere...

2

Bon, a priori, je dirais que c'est le break là qui pose problème:
if(s[0]==ancien+1)//bon paquet
{
texte[i]=s[1];
ancien=s[0];
r=1;
OSWriteLinkBlock(&r,sizeof(char)); //envoi de l'accusé bien recu
break; //on passe à la suite }


Sinon, tu as fait attention à ça (extrait de la doc de TIGCC) ?
OSReadLinkBlock reads at most num bytes into buffer from the link receive buffer. Returns the number of bytes read.


EDIT: hmm en fait nan cheeky (tu devrais peut-être remplacer les for vides par des while, ça serait plu clair ^^)
EDIT²: Au fait les wrning c parce que tu passes un char ** au lieu d'un char *. Pas étonnant que rien ne fonctionne :]
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3

Utilise LIO_SendData et LIO_RecvData, pas OSWriteLinkBlock.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

4

swal89 :
alors déja j'ai des Warning à la compilation qui viennent des lignes: OSWriteLinkBlock(&s,2*sizeof(char)); pourquoi?

Mets s, pas &s. &s est un char (*)[2], pas un char *.
et quand je teste, le programme de réception se termine prématurément pkoi? (ca affiche direct "chaine recue:" avec rien derrière)

Il n'y a pas de boucle d'attente dans OSReadLinkBlock, il te renvoie "0 octets lus" et termine s'il n'y a rien à lire.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

5

ok merci pour les infos, je vais corriger tt ca demain...

6

Kevin Kofler :
Il n'y a pas de boucle d'attente dans OSReadLinkBlock, il te renvoie "0 octets lus" et termine s'il n'y a rien à lire.

Si tu avais lu son code tu aurais vu que le problème n'était pas là roll

Et puis flooder c'est mal
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

7

Ah oui, les conditions des boucles for sont à l'envers... sick
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

8

mais pour la réception, meme si OSReadLinkBlock n'attend pas, la boule for vide va répéter la fonction non?
comment ca se fait que la boucle ne se fait pas?
meme en virant les break; ca affiche directement la phrase de fin confus

9

Regarde le post de Kevin où il te dit que ton problème c'est que les conditions des for sont a l'envers, il faut que tu mettes i < 6 et non pas i > 6, qui sera toujours faux puisque i est à 0 au départ ^^
Les break, cf l'edit de mon post, c pas ça le problème en fait, donc remet-les. (Par contre en revanche, il manquerait légèrement un break pour la lecture du clavier -> ça va sortir de la boucle for vide mais pas de l'autre.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

10

merci beaucoup, oui, c'était ca...
voila le nouveau source modifié: // C Source File // Created 06/11/2004; 10:33:26 #include <tigcclib.h> void _main(void) {         char ki=1; //ki fé koi? 0=>envoie 1=>recoit... A CHANGER LORS DE LA COMPILATION PR FAIRE 2 PROGS      char texte[6]; //texte à envoyer/recevoir      char s[2]; //encapsulage+char à envoyer      char r=0; //accusé de reception 0=>pas reçu 1=>bien reçu      char ancien=0; //numéro de l'ancien encapsulage      short key;      short i; //compteur (nb de caracteres à envoyer) ici 5 dans l'exemple        OSLinkOpen(); //------------------- //programme d'envoi      if(ki==0) {      strcpy(texte, "hello"); //texte à envoyer      ST_helpMsg("Envoi en cours...");            for(i=0; i<6; i++) //boucle d'envoi  {      s[0]=i; //encapsulage      s[1]=texte[i]; //insertion du char à envoyer correspondant à l'encapsulage      OSWriteLinkBlock(s,2*sizeof(char)); //envoi            for(;;)      {           if(OSReadLinkBlock (&r,sizeof(char)))           {                           if(r==1)//accusé bien recu donc on passe à la suite...                {                r=0;                break;                }                else  //sinon, on réenvoie le même !                     {                     s[0]=i; //encapsulage                     s[1]=texte[i]; //insertion du char à envoyer correspondant à l'encapsulage                     OSWriteLinkBlock(s,2*sizeof(char)); //envoi                     }           }                      if(kbhit())                {                     OSdequeue (&key, kbd_queue());                     if(key==KEY_ESC)                          break;     //transmission interrompue sortie de boucle                                          }                            }         } } //------------------- //reception else { ST_helpMsg("Reception en cours...");            for(i=0; i<6; i++) //boucle de reception  {            for(;;)      {           if(OSReadLinkBlock (s,2*sizeof(char)))           {                           if(s[0]==ancien+1)//bon paquet                {                texte[i]=s[1];                ancien=s[0];                r=1;                OSWriteLinkBlock(&r,sizeof(char)); //envoi de l'accusé bien recu                break; //on passe à la suite                }                                if(s[0]==ancien)//on a recu l'ancien paquet, l'accusé n'a donc pas été recu                {                OSWriteLinkBlock(&r,sizeof(char)); //réenvoi de l'accusé pour avoir la suite                }                           }                      if(kbhit())                {                     OSdequeue (&key, kbd_queue());                     if(key==KEY_ESC)                          break;     //transmission interrompue                }                            }         } clrscr(); printf("Chaine recue : %s", texte); //on affiche au final ce k'on a recu... ngetchx(); }            OSLinkClose();        }

Pour le break c pas trop grave, il suffit de faire plusieurs fois esc pour quitter (d'ailleurs comment sortir des deux boucles?
Ca marche mais à moitié sad

en fait la dernière boucle ne se fait pas des deux cotés... je suis obligé de faire esc une fois pour terminer les deux programmes
et la chaine de caractere affichée est "ello" il manque le h...
j'ai défois un autre caractere avant...
pourquoi? pourtant ma boucle commence bien à 0...

11

Pour sortir des deux boucles, tu peux créer une variable BOOL receiving = TRUE à laquelle tu assignes FALSE quand tu détectes ESC ou que la réception est terminée (pour une réception de longueur variable par exemple), ensuite il te suffit juste de remplacer le for(;wink par un while (receiving) et la condition i < 6 du premier for par (i < 6) && receiving. (pareil pour l'envoi)

Sinon pour le problème d'envoi, je crois que ça vient de ton "encapsulage" :] Au début ta variable 'ancien' est initialisée à 0 qui est aussi le nb du premier caractère envoyé, donc la condition s[0] == ancien + 1 retourne FALSE, mais pas s[0] == ancien. Du coup tu envoies ton accusé de réception, mais tu n'as pas lu le caractère... Tu pourrais remplacer les conditions par [i]s == i et [i]s == i - 1, mais je ne sais pas si c'est la meilleure solution.
Il faudrait aussi que tu vérifies la valeur retournée lors de la lecture pour savoir si tu as bien reçu deux octets et non pas un seul comme cela pourrait arriver sans que tu t'en rendes compte, ce qui fausserait ton message.
Et puis pour éviter les erreurs, si tu n'as pas un besoin vital du numéro contenu dans s[0] tu pourrais le remplacer par autre chose qui contiendrait un vérificateur de la validité du paquet en plus de la vérification de l'ordre, par exemple s[0] = ~s[1] ^ (i & 1) qui contient la négation du caractère dont le dernier bit est inversé si i est impair (ué c tordu mais ça doit certainement fonctionner ^^), ça serait plus fiable que ton protocole actuel je pense smile
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes