Differenze tra le versioni di "Ricevere una Struttura da Arduino"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "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 eventua...")
 
Riga 1: Riga 1:
 
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.
 
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 potrà procedere soltanto mediante due modalità.
+
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.
  
==Passare i valori dei membri attraverso le variabili==
 
Questa è la modalità più semplice ed anche più ovvia.
 
  
Ne mostriamo un semplice esempio, nel quale utilizzeremo ''Arduino'' UNO, il cui codice sarà il seguente:
+
Mostriamo un semplice esempio, nel quale utilizzeremo ''Arduino'' UNO, il cui codice sarà il seguente:
 
  struct STRUTTURA {
 
  struct STRUTTURA {
 
   byte b;
 
   byte b;
Riga 16: Riga 15:
 
   
 
   
 
  struct STRUTTURA st;
 
  struct STRUTTURA st;
 
 
   
 
   
 
  void setup() {
 
  void setup() {
 
    
 
    
 
   Serial.begin(9600);
 
   Serial.begin(9600);
 
+
 
 
   st.b = 99;
 
   st.b = 99;
 
   st.s = 999;
 
   st.s = 999;
Riga 32: Riga 30:
 
  void loop() {
 
  void loop() {
 
    
 
    
  Serial.write(st.b);
+
  PassaDatiStruttura((byte*)&st, sizeof(st));
  Serial.write(st.s);
 
  Serial.write(st.i);
 
  Serial.write(st.l);
 
 
    
 
    
  delay(5000);
+
  delay(5000);
 
    
 
    
 
  }
 
  }
 
   
 
   
 +
 +
void PassaDatiStruttura(byte* p, byte lungh) {
 +
 +
 
 +
 
 +
  for (byte i = 0; i<lungh; ++i)
 +
 
 +
<FONT Color=gray>' ''Dereferenzia il Puntatore e passa il valore:''</font>
 +
    Serial.write(*(p + i));
 +
   
 +
}
 +
  
Per ragioni di comodità e semplificazione del codice nel programma Gambas potremo raccogliere i dati provenienti da ''Arduino'' mediante una variabile vettoriale di tipo ''Variant'', facendo attenzione nell'attribuzione dei tipo di valore a ciascun elemento del vettore alla dimensione effettiva - sulla base del tipo di ''Arduino'' utilizzato - dei corrispondenti membri della ''Struttura'' presente 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''.
 
   
 
   
 
Mostriamo il seguente esempio (bisognerà attivare il Componente ''gb.net''):
 
Mostriamo il seguente esempio (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 SerialPort1 As SerialPort
  Private vett As New Variant[4]
+
  Private st As New STRUTTURA
  Private b as Byte
+
  Private sp As Pointer
 +
Private sm As Stream
 +
 
   
 
   
 +
'''Public''' Sub Main()
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  sp = Object.Address(st)
 +
  sm = Memory sp For Write
 +
 
 +
  <FONT Color=gray>' ''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:''</font>
 +
  Seek #sm, 24
 +
 
 +
  With SerialPort1 = New SerialPort As "portaseriale"
 +
    .PortName = "/dev/ttyUSB0"                        <FONT Color=gray>' ''Questa porta seriale o quella disponibile''</font>
 +
    .Speed = 9600
 +
    .Parity = 0
 +
    .DataBits = 8
 +
    .StopBits = 1
 +
    .FlowControl = 0
 +
    .Open
 +
  End With
 
    
 
    
  With SerialPort1 = New SerialPort As "portaseriale"
 
    .PortName = "/dev/ttyUSB0"                        <FONT Color=gray>' ''Questa porta seriale o quella disponibile''</font>
 
    .Speed = 9600
 
    .Parity = 0
 
    .DataBits = 8
 
    .StopBits = 1
 
    .FlowControl = 0
 
    .Open
 
  End With
 
 
 
 
  '''End'''
 
  '''End'''
 
   
 
   
Riga 69: Riga 91:
 
   Dim b As Byte
 
   Dim b As Byte
 
    
 
    
   Read #SerialPort1, vett[b]
+
   Read #SerialPort1, b
   Inc b
+
 
   
+
<FONT Color=gray>' ''Mostra i singoli dati dei byte passati:''</font>
  '''End'''
+
   Print Hex(b, 2)
   
+
 
+
  <FONT Color=gray>' ''Passa i singoli dati ricevuti all'area di memoria della Struttura dichiarata in Gambas:''</font>
  '''Public''' Sub Form_Close()
+
  Write #sm, b As Byte
   
+
  <FONT Color=gray>' ''Tiene conto del necessario "allineamento" fra i dati:''</font>
   If SerialPort1.Status = Net.Active Then SerialPort1.Close
+
  If Seek(sm) = 25 Then Write #sm, 0 As Byte
+
  <FONT Color=gray>' ''Tiene conto del necessario "allineamento" fra i dati:''</font>
 +
  If Seek(sm) = 30 Then Write #sm, 0 As Short
 +
 
 +
  <FONT Color=gray>' ''Terminata la ricostruzione del'area di memoria della Struttura, mostra i risultati:''</font>
 +
   If Seek(sm) = 35 Then
 +
    SerialPort1.Close()
 +
    sm.Close
 +
    Print
 +
    With st
 +
      Print .b
 +
      Print .s
 +
      Print .i
 +
      Print .l
 +
    End With
 +
  Endif
 +
 
 
  '''End'''
 
  '''End'''
 
 
 
 
 
<FONT Color=red size=4><B>Pagina in costruzione !</b></font>
 

Versione delle 08:58, 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));
  
  delay(5000);
 
}


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.

Mostriamo il seguente esempio (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