grazie si ci ho guardato e provato ad usarla ma non riesco adattarla alle mie esigenze
io devo inviare da una arduino ad un altro via seriale una serie di valori di temperatura ma non riesco a farlo ho creato una struct nel arduino in partenza ma mi trovo dei valori diversi in ricezione
La libreria funziona, e su questo non ci piove
, quindi ... la stai usando in modo errato ... sul sito che ti hanno indicato vendono un bel libro che la spiega dettagliatamente, altrimenti, senza comprare il libro, c'è tutto l'help su web.
Guglielmo
birrohgt:
grazie si ci ho guardato e provato ad usarla ma non riesco adattarla alle mie esigenze
io devo inviare da una arduino ad un altro via seriale una serie di valori di temperatura ma non riesco a farlo ho creato una struct nel arduino in partenza. . .
Perdonami, ma la mia sfera di cristallo non riesce a vedere i codici che hai scritto.
Dovresti fare uno sforzo e pubblicarli qui.
Ma se non ti va, non fa niente...
Ciao,
P.
ecco qui una piccola prova ma non funziona
trasmettitore
#include <PJONThroughSerial.h>
PJONThroughSerial bus(45);
int val = 10;
void setup() {
Serial1.begin(9600);
bus.strategy.set_serial(&Serial1); // Pass the Serial object you want to use for communication
bus.begin();
};
void loop() {
bus.send_packet(44, val, 1);
delay(2000);
};
ricevitore
#include <PJONThroughSerial.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
PJONThroughSerial bus(44);
void receiver_function(uint8_t *payload, uint16_t length, const PJON_Packet_Info &packet_info) {
// Print received data in the serial monitor
for(uint16_t i = 0; i < length; i++)
Serial.println(payload[i]);
}
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
bus.strategy.set_serial(&mySerial);
bus.set_receiver(receiver_function);
bus.begin();
}
void loop() {
bus.receive();
}
sul monitor seriale mi trovo dei numeri a caso
Prova così
. . .
bus.send_packet(44, &val, 1);
. . .
Ciao,
P.
funziona se al massimo invio un intero fino a 255
se invio un numero intero superiore non mi trovo piu il numero
Prova a dare un'occhiata al metodo 'send_packet' qui.
Ciao,
P.
Ciao, scusate ho visto solo ora il post ecco la soluzione:
@pgiagno sta cercando di spedire una int che e' fatta da 2 byte, passando come terzo parametro della funzione send_packet (che e' la lunghezza) il valore 1, cosi' non puo' funzionare.
Qui il link a un esempio che mostra come spedire un intero utilizzando PJON:
Qui il link a un esempio che mostra come spedire uno struct:
Come vedi gli esempi usano la strategia "SoftwareBitBang" che implementa PJDL, il protocollo che utilizza un singolo filo da me definito nell'ultimo decennio. Ti basta adattare l'esempio alla strategia ThroughSerial e dovresti essere a posto.
Ti consiglio di provare cmq SoftwareBitBang perche' potrebbe fare al caso tuo e sostituire la seriale utilizzando un singolo filo (piu' la massa) a cui puoi connettere fino a 255 device.
Fammi sapere se hai problemi.
grazie ci provo
cosa significa nel invio
(uint8_t)(voltage >> 8)
Ma perchè non convertire l'intero in stringa?
String str_valore=String(int_valore)
Adesso volendo puoi anche inviare un carattere per volta
Serial.write(str_valore[0]);
Serial.write(str_valore[1]);
ecc.....
Non ho provato ma dovrebbe funzionare
GianlucaB:
Ma perchè non convertire l'intero in stringa?String str_valore=String(int_valore)
Perché abbiamo detto e ripetuto infinite volte di NON usare la classe String ... specie per fare una cosa banale come questa!
Guglielmo
In realtà io le utilizzo per comunicare con un pc.
Ho il vantaggio che prima del valore numerico posso inserire una lettera per identificare il valore ricevuto.
Perché se devi inviare diversi valori in sequenza, inserendo un carattere prima del valore, poi li identifichi in modo semplice.
Ed ... in realtà tu ... stai seguendo una pessima strada che ti porterà prima o poi a problemi !
NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!! ![]()
Ti consiglio invece di studiare ed imparare ad usare le stringhe classiche del C ... ovvero semplici array di char terminati dal carattere null (0x00) e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h>.
Guglielmo
P.S.: ... oppure, se proprio "ti piace vincere facile", almeno studiati la classe SafeString di cui abbiamo a lungo parlato in area Software. ![]()
Sò perfettamente che la string occupa memoria, e che arduino non é un computer, ma tutto dipende da quello che uno deve fare.
Nel mio caso ad esempio devo inviare un dato al pc, e ricevere 2 dati diversi, che tra l'altro possono arrivare in modo random, e visualizzarli su un display collegato via i2c.
L'arduino nano riesce tranquillamente a svolgere tale funzione, perché dovrei sbattermi ad utilizzare byte dividerli rimetterli insieme ecc. quando posso risolvere utilizzando 2stringhe?
Concordo sull'ottimizzare le risorse, ma se le risorse lo permettono, si può anche scegliere la strada della semplicità.
Vedo che NON hai capito e che, evidentemente, NON conosci come funziona la classe String ... :![]()
Contento tu ... prosegui pure, poi però NON venire qui a chiedere aiuto quando i programmi, misteriosamente, si bloccheranno o Arduino si riavvierà perché ... sai già da cosa dipenderà.
Guglielmo
P.S.: ... e comunque siamo off-topic ... per cui finiamo qui ... ci sono già troppi thread sull'argomento.
gioscarab:
Ciao, scusate ho visto solo ora il post ecco la soluzione ....
grazie per il consiglio ho fatto delle prove e funziona
ma ho un problemino se volessi trasmettere strutture diverse come faccio in ricezione a inserirle nella struttura giusta cioe riconoscere quello che sto ricevendo??
grazie
Ciao, mi fa piacere sapere che tu sia riuscito a implementare l'esempio con successo, qui c'e' un esempio che mostra come spedire una struct definita dall'utente: PJON/examples/ARDUINO/Local/SoftwareBitBang/SendArbitraryDataType at master · gioblu/PJON · GitHub
Ovviamente, come prima devi adattare l'esempio perche' funzioni con la strategia che usi tu. Fammi sapere come va.
si ok quello avevo gia visto e provato
ma se devo inviare strutture diverse tipo struct A e struct B in momenti diversi
come faccio a riconoscerle in ricezione?
Beh, ad esempio, metterai come primo campo della struttura un identificativo che ti dice di QUALE delle varie strutture si tratta ...
Se NON sono tutte della stessa lunghezza, dovrai probabilmente prevedere un meccanismo di ricezione univoco (ad esempio in un buffer generico della massima lunghezza) ed il successivo spostamento, una volta identificata la struttura, nella vera struttura delle dimensioni giuste.
Guglielmo
non è possibile inviare un array di byte con al interno il primo byte un indice e dal secondo in avanti la struttura?
poi in ricezione leggere il primo byte e mettere il resto dentro la struttura interessata?