Differenze tra le versioni di "Ricevere una Struttura da Arduino"
(6 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 3: | Riga 3: | ||
Poiché nel caso in esame la memoria di ''Arduino'' e del computer, ove gira il nostro programma Gambas, non è ovviamentre la stessa, essendo due ''hardware'' diversi, per passare i dati, contenuti dai membri di una ''Struttura'', da ''Arduino'' a Gambas, non sarà possibile passare via codice la variabile di tipo ''Struttura'' né il suo indirizzo di memoria. Pertanto si dovrà inviare al programma Gambas <SPAN Style="text-decoration:underline">ciascun singolo byte</span> dell'area di memoria della ''Struttura''. | Poiché nel caso in esame la memoria di ''Arduino'' e del computer, ove gira il nostro programma Gambas, non è ovviamentre la stessa, essendo due ''hardware'' diversi, per passare i dati, contenuti dai membri di una ''Struttura'', da ''Arduino'' a Gambas, non sarà possibile passare via codice la variabile di tipo ''Struttura'' né il suo indirizzo di memoria. Pertanto si dovrà inviare al programma Gambas <SPAN Style="text-decoration:underline">ciascun singolo byte</span> dell'area di memoria della ''Struttura''. | ||
− | In Gambas, servendosi pure della risorsa ''Memory Stream'', si dovrà poi ''ricostruire'' tale area di memoria, tenendo anche in dovuta considerazione sia la dimensione di ciascun dato passato sulla base del tipo di ''Arduino'' utilizzato, sia gli eventuali necessari ''allineamenti'' dei tipi di dati. | + | In Gambas, servendosi pure della risorsa ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'', si dovrà poi ''ricostruire'' tale area di memoria, tenendo anche in dovuta considerazione sia la dimensione di ciascun dato passato sulla base del tipo di ''Arduino'' utilizzato, sia gli eventuali necessari ''allineamenti'' dei tipi di dati. |
− | Mostriamo un semplice esempio, nel quale utilizzeremo ''Arduino'' UNO, il cui codice sarà il seguente: | + | Mostriamo un semplice esempio (è necessario attivare il Componente ''gb.net'' ), nel quale utilizzeremo ''Arduino'' UNO, il cui codice sarà il seguente: |
struct STRUTTURA { | struct STRUTTURA { | ||
byte b; | byte b; | ||
Riga 13: | Riga 13: | ||
long l; | long l; | ||
}; | }; | ||
− | |||
− | |||
void setup() { | void setup() { | ||
Serial.begin(9600); | Serial.begin(9600); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
Riga 29: | Riga 22: | ||
void loop() { | void loop() { | ||
− | |||
− | |||
− | + | struct STRUTTURA st; | |
− | + | ||
− | + | st.b = 99; | |
− | + | st.s = 999; | |
− | + | st.i = 9999; | |
− | + | st.l = 99999; | |
− | |||
− | + | Serial.write((byte *) &st, sizeof(st)); | |
− | |||
− | + | delay(300); | |
− | |||
} | } | ||
+ | |||
Nel codice del programma Gambas verrà dichiarata una ''Struttura'', facendo attenzione nell'attribuzione dei tipo di valore a ciascun suo membro alla dimensione effettiva - sulla base del tipo di ''Arduino'' utilizzato - dei corrispondenti membri della ''Struttura'' presente nello ''sketch'' in ''Arduino''. | Nel codice del programma Gambas verrà dichiarata una ''Struttura'', facendo attenzione nell'attribuzione dei tipo di valore a ciascun suo membro alla dimensione effettiva - sulla base del tipo di ''Arduino'' utilizzato - dei corrispondenti membri della ''Struttura'' presente nello ''sketch'' in ''Arduino''. | ||
− | + | <BR>Il codice dell'applicativo Gambas (bisognerà attivare il Componente "gb.net") comunica con la porta seriale "/dev/ttyUSB0" o potrà essere anche “/dev/ttyACM0” (ovviamente il numero finale può essere anche diverso se sono stati connessi altri dispositivi analoghi). E' necessario attivare il Componente ''gb.net''. | |
Public Struct STRUTTURA | Public Struct STRUTTURA | ||
b As Byte | b As Byte | ||
Riga 66: | Riga 55: | ||
− | + | Public Sub Main() | |
sp = Object.Address(st) | sp = Object.Address(st) | ||
Riga 84: | Riga 73: | ||
End With | End With | ||
− | + | End | |
− | + | Public Sub portaseriale_Read() | |
− | + | Dim b As Byte | |
Read #SerialPort1, b | Read #SerialPort1, b | ||
Riga 116: | Riga 105: | ||
Endif | Endif | ||
− | + | End |
Versione attuale delle 15:06, 25 giu 2024
Una Struttura è sostanzialmente un'area di memoria riservata avente una dimensione pari alla somma dei tipi di valore, appartenenti a ciascun suo membro, più gli eventuali necessari allineamenti.
Poiché nel caso in esame la memoria di Arduino e del computer, ove gira il nostro programma Gambas, non è ovviamentre la stessa, essendo due hardware diversi, per passare i dati, contenuti dai membri di una Struttura, da Arduino a Gambas, non sarà possibile passare via codice la variabile di tipo Struttura né il suo indirizzo di memoria. Pertanto si dovrà inviare al programma Gambas ciascun singolo byte dell'area di memoria della Struttura.
In Gambas, servendosi pure della risorsa Memory Stream, si dovrà poi ricostruire tale area di memoria, tenendo anche in dovuta considerazione sia la dimensione di ciascun dato passato sulla base del tipo di Arduino utilizzato, sia gli eventuali necessari allineamenti dei tipi di dati.
Mostriamo un semplice esempio (è necessario attivare il Componente gb.net ), nel quale utilizzeremo Arduino UNO, il cui codice sarà il seguente:
struct STRUTTURA { byte b; short s; unsigned int i; long l; }; void setup() { Serial.begin(9600); } void loop() { struct STRUTTURA st; st.b = 99; st.s = 999; st.i = 9999; st.l = 99999; Serial.write((byte *) &st, sizeof(st)); delay(300); }
Nel codice del programma Gambas verrà dichiarata una Struttura, facendo attenzione nell'attribuzione dei tipo di valore a ciascun suo membro alla dimensione effettiva - sulla base del tipo di Arduino utilizzato - dei corrispondenti membri della Struttura presente nello sketch in Arduino.
Il codice dell'applicativo Gambas (bisognerà attivare il Componente "gb.net") comunica con la porta seriale "/dev/ttyUSB0" o potrà essere anche “/dev/ttyACM0” (ovviamente il numero finale può essere anche diverso se sono stati connessi altri dispositivi analoghi). E' necessario attivare il Componente gb.net.
Public Struct STRUTTURA b As Byte s As Short i As Short l As Integer End Struct Private SerialPort1 As SerialPort Private st As New STRUTTURA Private sp As Pointer Private sm As Stream Public Sub Main() sp = Object.Address(st) sm = Memory sp For Write ' I valori dei membri di una "Struttura" dichiarata con la parola chiave "New" sono immagazzinati a cominciare dal 25° (indice 24) byte della sua area di memoria: Seek #sm, 24 With SerialPort1 = New SerialPort As "portaseriale" .PortName = "/dev/ttyUSB0" ' Questa porta seriale o quella disponibile .Speed = 9600 .Parity = 0 .DataBits = 8 .StopBits = 1 .FlowControl = 0 .Open End With End Public Sub portaseriale_Read() Dim b As Byte Read #SerialPort1, b ' Mostra i singoli dati dei byte passati: Print Hex(b, 2) ' Passa i singoli dati ricevuti all'area di memoria della Struttura dichiarata in Gambas: Write #sm, b As Byte ' Tiene conto del necessario "allineamento" fra i dati: If Seek(sm) = 25 Then Write #sm, 0 As Byte ' Tiene conto del necessario "allineamento" fra i dati: If Seek(sm) = 30 Then Write #sm, 0 As Short ' Terminata la ricostruzione del'area di memoria della Struttura, mostra i risultati: If Seek(sm) = 35 Then SerialPort1.Close() sm.Close Print With st Print .b Print .s Print .i Print .l End With Endif End