Problema con UDP

Sono alle ultime battute del mio "famoso progetto" Ho utilizzato e modificato l'esempio della comunicazione tra 2 arduino tramite UDP in pratica devo accendere via Lan un led, la mia idea è questa " dalla parte di quello che invia, faccio così:

stato4 = digitalRead(4); stato5 = digitalRead(5); stato6 = digitalRead(6); stato7 = digitalRead(7);

if (stato4 == HIGH) { (stati=stati+1); } if (stato5 == HIGH) { (stati=stati+2); } if (stato6 == HIGH) { (stati=stati+4); } if (stato7 == HIGH) { (stati=stati+8); }

itoa(stati,invio,10);

Udp.sendPacket( invio, remoteIp, remotePort);

e dalla parte dove ricevo:

Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);

ricevuto=atoi(packetBuffer);

seguito da uno switch che mi sceglie cosa fare... il mio problema è il Buffer ... se prima di scriverci faccio chat packetBuffer ="0"; fa un casino inferale, il programma diventa lento ed inoltre una riga sul serial monitor sparisce e scrive caratteri a caso, se non "azzero" il Buffer, nel caso di ricezione 12 ad esempio, e poi 3, il buffer non si riscrive completamente,ma lascia alcune tracce che rendono il risultato sporco ed inutilizzabile, in pratica ottengo valori strani.. è 3 giorni che ci impazzisco... non riesco ne a pulire il buffer ne a trovare una soluzione alternativa...AIUTOOO

Ciao Tommaso,

come hai definito le variabili invio e packetBuffer?

Conta che sia itoa che atoi lavorano su array di char. Es: http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/ http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Quindi se scrivi

chat packetBuffer ="0";

che in realta' immagino fosse

char packetBuffer ='0';

stai facendo un po' un pasticcio perche' se poi chiami

ricevuto=atoi(packetBuffer);

atoi si aspetterebbe un char * invece tu gli dai un char.

In teoria il compilatore dovrebbe segnalarti un errore sui tipi, pero' forse e' questo il tuo problema?

Sisi…è char…

si penso che il mio problema stia proprio in tutto questo casino che faccio con puntatori, array, & co.

ho un livello di programmazione, molto “didattico” e quindi ricorro spesso a trucchetti per ricondurmi a situazioni semplici…

secondo te quale è il sistema migliore per inviare via UDP un numero?
e dall’altra parte ricevere un numero? lavorando in base 2 ero sicuro che con 4 stati, qualsiasi numero da 1 a 15 mi dava un informazione univoca su quali sensori erano ON, se no non saprei come fare
quindi prendevo un numero, lo trasformavo in carattere con itoa, lo inviavo e di là con atoi lo riportavo in numero…ma è macchinosa come cosa
se no ho pensato che potrei inviare un array dove invio uno stato per ogni led, ma ho paura di far casino

ah invio l'ho definito un int, e packedBuffer un array con dimensione UDP_TX_PACKET_MAX_SIZE,

Allora immagino che il problema sia come hai definito invio… cioe’ invio dovrebbe essere anche lui un array di char… per stare sicuro provalo a metterlo con lunghezza.

Immagino che il problema stia nel fatto che invio, essendo un int, ha riservato per lui in memoria un solo byte. Quando pero’ fai itoa(stati,invio,10); lui si aspetta un array di char, conta poi che tutte le stringhe vengono memorizzate come “caretteri\0” dove il \0 e’ il carattere speciale NULL che indica il fine stringa.

Quindi anche se la tua variabile stati e’ <= 9, quindi rappresentabile sempre in base 10 con un solo carattere, avrai pero’ sempre appeso al fondo \0 e quindi, anche se stati e’ <=9, itoa scrivera’ in una zona di memoria non allocata per stati… se lavorassi su un PC normale riceveresti probabilmente un segmentation fault!

Invece Arduino si mangia tutto e va avanti pero’ poi si ottengono risultati strambi come i tuoi.

Un po' di esempi di uso delle stringhe in C: http://www.dis.uniroma1.it/~degiacom/didattica/informatica_grafica/00-11-10/stringhe.c

ma il mio problema principale è se io converto un int in un carattere, e lo invio, poi prendo il buffer che ricevo, lo riconverto in int, funziona tutto..

solo che non riesco a sovrascrivere completamente il Buffer...se io invio in ordine 1, 2, 12, 3 dall'altra parte ricevo 1, 2, 12, 13! l'1 del 12 non viene + sovrascritto fino a quando non cambia anche il secondo byte....quindi io facevo una forzatura scrivendo "0" sul buffer e poi quando ricevevo il pacchetto ci veniva riscritto il valore corretto.. il problema è che quel char buffer ="0" fa casino, non solo rallenta il programma di 10 volte, si passa da pochi millesecondi a centinaia di millisecondi, ma anche fa casino sulla serial.print e anche sulla funzione millis(), che non funziona + correttamente...

come posso fare a fare in modo che il buffer è per esempio solo 2 byte e ad ogni loop viene riazzerato, oppure solo ripulito, o anche solo scritto roba a caso tipo "xx"?

si scusa, invio è un array di caratteri char invio[]; definito così senza dimensione prefissata

itoa si aspetta che invio sia gia' un'area di memoria allocata.. se lo dichiari senza mettere una lunghezza lui lo dichiara come puntatore a un'area di memoria non allocata che puo' dare problemi.

Quindi devi dichiarare la lunghezza di invio.

Se continui ad avere problemi posta il codice per intero altrimenti e' difficile aiutarti senza vedere tutte le dichiarazioni.