Ricevere una Struttura da Arduino: differenze tra le versioni
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 31: | Riga 31: | ||
PassaDatiStruttura((byte*)&st, sizeof(st)); | PassaDatiStruttura((byte*)&st, sizeof(st)); | ||
} | } | ||
Versione delle 10:03, 22 nov 2015
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, nel quale utilizzeremo Arduino UNO, il cui codice sarà il seguente:
struct STRUTTURA {
byte b;
short s;
unsigned int i;
long l;
};
struct STRUTTURA st;
void setup() {
Serial.begin(9600);
st.b = 99;
st.s = 999;
st.i = 9999;
st.l = 99999;
}
void loop() {
PassaDatiStruttura((byte*)&st, sizeof(st));
}
void PassaDatiStruttura(byte* p, byte lungh) {
for (byte i = 0; i<lungh; ++i)
' Dereferenzia il Puntatore e passa il valore:
Serial.write(*(p + i));
}
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 nostro esempio il codice del programma Gambas sarà il seguente (bisognerà 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