Go Down

Topic: comunicazione tra 2 arduini via seriale  (Read 722 times) previous topic - next topic

gpb01

#30
Apr 08, 2021, 07:52 pm Last Edit: Apr 08, 2021, 07:53 pm by gpb01
Ma perchè non convertire l'intero in stringa?
Code: [Select]
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
Search is Your friend ... or I am Your enemy !

GianlucaB

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.

gpb01

#32
Apr 09, 2021, 06:19 am Last Edit: Apr 09, 2021, 10:21 am by gpb01
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 !!!   :smiley-evil:

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.  :D
Search is Your friend ... or I am Your enemy !

GianlucaB

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à.







gpb01

#34
Apr 10, 2021, 02:35 pm Last Edit: Apr 10, 2021, 03:00 pm by gpb01
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.
Search is Your friend ... or I am Your enemy !

birrohgt

#35
Apr 10, 2021, 05:02 pm Last Edit: Apr 10, 2021, 05:12 pm by gpb01
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

gioscarab

#36
Apr 10, 2021, 07:23 pm Last Edit: Apr 10, 2021, 07:24 pm by gioscarab
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: https://github.com/gioblu/PJON/tree/master/examples/ARDUINO/Local/SoftwareBitBang/SendArbitraryDataType

Ovviamente, come prima devi adattare l'esempio perche' funzioni con la strategia che usi tu. Fammi sapere come va.

birrohgt

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?

gpb01

#38
Apr 10, 2021, 07:55 pm Last Edit: Apr 10, 2021, 07:57 pm by gpb01
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
Search is Your friend ... or I am Your enemy !

birrohgt

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?

gioscarab

#40
Apr 10, 2021, 08:08 pm Last Edit: Apr 10, 2021, 08:08 pm by gioscarab
Ciao Guglielmo, esattamente :)
Ciao birroh, assolutamente si, il primo carattere del payload potrebbe simboleggiare quale struct stai spedendo, cio' che segue potrebbe essere la struct stessa.

Una soluzione ancora piu' semplice, a patto che la rete sia locale e che tutte le struct abbiano lunghezze diverse e' utilizzare la lunghezza del payload per determinare quale struct si sta ricevendo.

gioscarab

Ovviamente, l'ultima soluzione proposta va bene se le struct sono 3 e non cambiano, se hai 30 struct che possono anche cambiare questa non e' la soluzione adatta per ovvi motivi, meglio avere un byte di overhead in piu' che simboleggia il tipo di struct e non richiare per colpa di un aggiornamento disattento di rompere qualcosa (modificando una struct si ottiene una nuova lunghezza uguale ad un altra struct).

birrohgt

#42
Apr 10, 2021, 08:25 pm Last Edit: Apr 10, 2021, 08:43 pm by birrohgt
grazie
come faccio ad inviare la struttura dopo il primo carattere? mi fai un esempio?

devo preparare un buffer prima di inviarlo immagino

r è la mia struttura
Code: [Select]
struct voltage_record {
  uint16_t voltage;
  uint16_t id;
};

voltage_record r;

uint8_t content[] = {'V', &r, sizeof(r)};


grazie

gioscarab

#43
Apr 10, 2021, 08:58 pm Last Edit: Apr 10, 2021, 08:58 pm by gioscarab
Non sono al mio computer quindi non ho modo di testarlo pero' questo dovrebbe essere quello che chiedi:
Code: [Select]

#define MAX_LENGTH 50

struct voltage_record {
  uint16_t voltage;
  uint32_t id;
};

voltage_record r;
uint8_t buffer[MAX_LENGTH];

buffer[0] = 'V'; // Simbolo voltaggio
memcpy(buffer + 1, r, sizeof(r)); // Copio la struct nell'array

bus.send_packet(44, &buffer, sizeof(r) + 1);



birrohgt

grazie 

purtroppo questo da errore

Code: [Select]
memcpy(buffer + 1, r, sizeof(r)); // Copio la struct nell'array

Go Up