Ricevere da Arduino un tipo di dato di dimensione superiore al Byte

Da Gambas-it.org - Wikipedia.

La trasmissione via seriale mediante la funzione Serial.write() consente l'invio di un byte alla volta. Ciò rende problematico, quindi, l'invio ad un programma Gambas di valori rappresentati da tipi di dati superiore ad un byte.

Per inviare tipi di dati superiore al Byte, si leggerà nell'area di memoria della variabile contenente il valore e si passerà da Arduino al programma Gambas ciascun byte costituente il valore. Il programma Gambas dovrà poi ricostruire il valore iniziale, come detto passato byte per byte, tenendo conto del tipo di Arduino utilizzato.


Mostriamo un esempio, nel quale il codice in Arduino UNO invia ad un programma Gambas un dato di tipo unsigned int:

void setup() {
   
  Serial.begin(9600);
 
}


void loop() {
 
  byte * pi;
  unsigned int i = 12345;
  pi = (byte *) &i;
 
  Serial.write(pi, sizeof(unsigned int));
  
  delay(300);
    
}


Il codice del programma Gambas, che riceve il dato sarà il seguente:

Private SerialPort1 As SerialPort
Private ss As New String[]
Private b As Byte


Public Sub Main()

 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 y As Byte
 
  Read #SerialPort1, y
  
  ss.Push(Hex(y, 2))

  Inc b

' Ricostruisce il valore iniziale presente in "Arduino":
  If b = 2 Then
    ss.Reverse()
    Print Val("&" & ss.Join(Null, Null))
    Quit
  Endif
  
End


Public Sub Form_Close()
 
  If SerialPort1.Status = Net.Active Then SerialPort1.Close
 
End


Analogamente si può procedere per gli altri tipi di dato di dimensione superiore a 1 byte.