docdoc:
Ma scusa, mi sfugge qualcosa... Ma tu i due Arduino li alimenti separatamente con un alimentatore ciascuno, o usi solamente la USB? Perché se è la seconda, è ovvio che si spenga quando sfili la USB e quindi ricominci da zero quando la colleghi...
Non puoi usare due porte USB sullo stesso PC e quindi tenerle sempre collegate (ovviamene i due IDE devi assegnarli ognuno alla propria porta)?
EDIT: mi associo alle giuste osservazioni di fabpolli, ma per prima cosa verifica il discorso almentazione/USB...
Gli Arduini sono collegati entrambi allo stesso pc tramite due porte USB diverse. Se faccio una qualche modifica al codice e lo carico su uno dei due (o su entrambi) le seriali SW non si reinizializzano automaticamente, ma devo staccare/riattaccare (ovvero spegnere/riaccendere) il receiver per far ricominciare la comunicazione.
Modifica dell'ultimo minuto: dal codice del sender ho tolto la funzione Sender.available()...inteso come: "non badare al collegamento seriale, fai ciò che devi a prescindere". E la situazione è decisamente migliorata!
fabpolli:
Non entro nel merito del codice perché @Standardoil ha già detto il necessario, rispondo ai tuoi questi per quanto possibile:
Il sender stampa correttamente il valore dell'int perché gli stai chiedendo di stampare quello e la print è fatta bene quindi lo stampa corretto, come da te ipotizzato stamperai valori compresi nel range dell'int ma non si fermerà a +2..... ma se continui ad incrementarlo non essendo definito unsigned arrivato all'overflow stamperebbe -2.... fino ad arrivare a zero per poi tornare ai positivi e ripetere il ciclo all'infinito.
Lato receiver ti stampa fino a 255 proprio perché è il limite di un char, non ti segue i valori inviati perché non hai sistemato il codice del receiver (come nelle guide linkate), altrimenti avresti i medesimi valori del sender.
Quando cambi la porta com e apri il serial monitor questo causa il riavvio di Arduino il che mi porta a chiederti, il codcie che stai facendo è a mero scopo di studio? Se si ok, vai pure avanti così per imparare se invece il tutto è volto ad un progetto reale allora ti dico che la strada che hai intrapreso è quantomeno poco corretta, e ti spiego il perché; in una trasmissione tra due o più dispositivi non solo occorre stabilire il collegamento e inviare i dati ma ti serve un "protocollo" che renda sicure le trasmissioni (e non mi sto riferendo a criptarli) in modo tale che quando il ricevente riceve un messaggio può determinare quando questo è terminato (nel tuo caso dovrestri aspettare almeno due byte) se il messaggio stesso è corretto ovvero se ricevuto dall'inizio alla fine, se quello che ho ricevuto è formalmente corretto, ecc.
Come hai fatto tu se il ricevente lo colleghi dopo del trasmittente riceveresti un flusso di dati che potrebbe non essere coerente (Es. parti a ricevere non dal byte 0 ma dal byte 1 e tutto fa a farsi benedire).
Aspetto la tua risposta perché se fosse l'inizio di una comunicazione per un progetto reale (Es. Arduino fuori con sensore tempratura che invia il dato ad un arduino interno con display) allora forse ti converrebbe cambiare strategia, a meno di non voler spendere decine di ore a creare e gestire un tuo protocollo, che ci stà é se è un hobby può essere anche divertente farlo.
In questo momento la cosa principale che voglio fare è capire ed imparare, a piccoli passi (e pensavo che passare un int incrementato fosse più facile :o forse con un carattere si semplifica, ma ancora devo testare). Successivamente si, vorrei dilettarmi a far comunicare più arduini tramite modulo LoRa collegato tramite RS485. L'idea malsana è proprio quella di arrivare a scrivere un miniprotocollo (al momento mi interessa principalmente il discorso comunicazione, sensori e altro saranno una diretta conseguenza)...ma la strada è lunga e difficile!
Comunque, mi pare di aver capito che tramite read() (e quindi tramite comunicazione seriale in generale?) posso leggere 1 solo byte alla volta, di conseguenza il massimo valore dell'intero che posso ricevere è 255. Per poter leggere interi rappresentati da più byte, dovrei mettere su un buffer e sommare i byte quando sono >1, per poi stamparli a monitor?!?
Al momento la soluzione migliore che ho trovato (non si blocca se ricarico il codice) con l'unica pecca che non riceve/stampa a video valori maggiori di 255 è la seguente:
sender
#include <SoftwareSerial.h>
SoftwareSerial Sender(10,11);
unsigned int v=0;
void setup() {
Serial.begin(9600);
delay(1000);
Sender.begin(9600);
delay(1000);
}
void loop() {
{
Sender.write(v);
Serial.println(v);
++v;
delay(500);
}
}
Receiver
#include <SoftwareSerial.h>
SoftwareSerial Receiver(10,11);
unsigned int x;
void setup() {
Serial.begin(9600);
delay(1000);
Receiver.begin(9600);
delay(1000);
}
void loop() {
while(Receiver.available()){
x=Receiver.read();
Serial.println(x);
}
}
Le ho provate tutte, (parseInt()-write() nel receiver al posto di println...)ma nessuna da risultati così "soddisfacenti". Credo di aver seguito correttamente gli esempi dei link che mi avete gentilmente postato, se mi è sfuggito qualcosa sono pronto ad autoflagellarmi.
Ancora...grazie mille!