Bonjour, à tous,
je debute avec arduino et je me retrouve déjà avec un problème que je n'arrive pas à comprendre.
Je désire envoyer une chaine de caractères en UDp avec la librairie UDP, lorsque un des octects à une valeur 0, il n'est pas transmis et l'ensemble des octects suivants ne sont pas envoyés.
par exemple:
je declare une constante:
char z6 []= {0x01,0x05x0x0,0x2f,xff};
puis j'envoie la chaine
Udp.sendPacket( z6, ipsend, 8000);
seuls les 2 premiers octects sont envoyés 0x01 et 0x05 les 3 octects suivants sont ignorés.
C'est normal, la fin d'une chaîne de caractères étant indiquée par la valeur 0. Il faudrait plutôt passer un tableau d'octets (byte) à la méthode Udp.sendPacket plutôt qu'un tableau de caractères (char). Voici un exemple : http://arduino.cc/en/Tutorial/UdpNtpClient
Pour envoyer ton tableau de byte contrairement à l'envois d'un tableau de char tu dois spécifier la taille du dit tableau ou packet apparement.
Logique avec un string (char[]) facile de connaitre la taille du paquet grace au eof (0), par contre avec un talbeau de byte il faut le spécifier.
Udp.sendPacket( packetBuffer,NTP_PACKET_SIZE, address, 123); //NTP requests are to port 123
Donc normal qu'il n'accepte pas de byte, je suppose que la compil te propose les solutions de la signature correspondant au char comme il n'y a que trois paramètres?
uint16_t sendPacket(uint8_t *, uint16_t, uint8_t *, uint16_t); //send a packet to specified peer
uint16_t sendPacket(const char[], uint8_t *, uint16_t); //send a string as a packet to specified peer
/* Send packet contained in buf of length len to peer at specified ip, and port */
/* Use this function to transmit binary data that might contain 0x00 bytes*/
/* This function returns sent data size for success else -1. */
uint16_t UdpClass::sendPacket(uint8_t * buf, uint16_t len, uint8_t * ip, uint16_t port){
return sendto(_sock,(const uint8_t *)buf,len,ip,port);
}
/* Send zero-terminated string str as packet to peer at specified ip, and port */
/* This function returns sent data size for success else -1. */
uint16_t UdpClass::sendPacket(const char str[], uint8_t * ip, uint16_t port){
// compute strlen
const char *s;
for(s = str; *s; ++s);
uint16_t len = (s-str);
// send packet
return sendto(_sock,(const uint8_t *)str,len,ip,port);
}
for(s = str; *s; ++s); condition d'arrêt, temps que *s est différent de 0 (false)