Differenze tra le versioni di "Ricevere da Arduino un tipo di dato di dimensione superiore al Byte"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "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...")
 
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
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.
+
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.
 
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'':
+
Mostriamo un esempio, nel quale il codice in ''Arduino'' UNO invia ad un programma Gambas un dato di tipo ''unsigned int'. E' necessario attivare il Componente ''gb.net''.
 
  void setup() {
 
  void setup() {
 
      
 
      
Riga 19: Riga 19:
 
    
 
    
 
   Serial.write(pi, sizeof(unsigned int));
 
   Serial.write(pi, sizeof(unsigned int));
    delay(100);
+
 
 +
  delay(300);
 
      
 
      
 
  }
 
  }
  
  
Il codice del programma Gambas, che riceve il dato sarà il seguente:
+
Il codice del programma Gambas, che riceve il dato, 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).
 
  Private SerialPort1 As SerialPort
 
  Private SerialPort1 As SerialPort
 
  Private ss As New String[]
 
  Private ss As New String[]
Riga 30: Riga 31:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
   
 
   
 
   With SerialPort1 = New SerialPort As "portaseriale"
 
   With SerialPort1 = New SerialPort As "portaseriale"
Riga 42: Riga 43:
 
   End With
 
   End With
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub portaseriale_Read()
+
  Public Sub portaseriale_Read()
 
    
 
    
  Dim y As Byte
+
  Dim y As Byte
 
    
 
    
 
   Read #SerialPort1, y
 
   Read #SerialPort1, y
Riga 62: Riga 63:
 
   Endif
 
   Endif
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Close()
+
  Public Sub Form_Close()
 
    
 
    
 
   If SerialPort1.Status = Net.Active Then SerialPort1.Close
 
   If SerialPort1.Status = Net.Active Then SerialPort1.Close
 
    
 
    
  '''End'''
+
  End
 
 
 
 
 
Analogamente si può procedere per gli altri tipi di dato di dimensione superiore a 1 byte.
 
Analogamente si può procedere per gli altri tipi di dato di dimensione superiore a 1 byte.

Versione attuale delle 16:04, 25 giu 2024

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'. E' necessario attivare il Componente gb.net.

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, 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).

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.