Arduino Ethernet et l'iphone

On récapépète depuis le bédut :wink: (Qui connais Garcimore ?)

Sur l'arduino tu fait

itoa(valLdr, ReplyBuffer, 10);

Donc si valLdr vaut par exemple 123, tu écris dans ReplyBuffer les char/octets suivants : '1', '2', '3', '\0' car itoa() est bien élévé et ajoute le caractère de fin de chaîne.

Ensuite tu fait :

Udp.write(ReplyBuffer);

Et là il faut remonter la hiérarchie de classe UdpClient -> Client -> Stream -> Print pour trouver que :

Print::write( char *p ) { return write( (uint8_t*)p, strlen( p ) ); }

Donc en écrivant ta ligne ci-dessus, c'est comme si tu avais écrit :

Udp.write( (uint8_t*)ReplyBuffer , strlen(ReplyBuffer) );

Mais comme chacun sait, strlen() ne compte pas le zéro terminal donc tu ne transmet que les caractères '1', '2' et '3'.

Quand çà arrive sur l'iPhone, ces 3 octets sont écrits dans buf et seulement ceux-ci. Le 4ème octet et les suivants de buf sont inconnus.
Donc la chaîne n'est pas terminée.

A cela 2 solutions :

  • Soit s'assurer que le \0 terminal soit toujours envoyé depuis l'Arduino.
  • Soit ajouter le \0 terminal à l'arrivée.

Il reste une 3eme écriture du code qui est peut être la plus élégante :

memset( buf, 0, sizeof(buf) );
msg1 = recv(s,buf,sizeof(buf),MSG_WAITALL);

En s'assurant que buf est initialisé à zéro avant la réception, ça marche bien aussi.

Bon Week-end