Comunicazione seriale Arduino-Xojo

Ciao a tutti,
io ho un problema con la comunicazione seriale (Arduino <–> Xojo); il problema che quando Arduino mi manda la prima stringa di dati, il software di Xojo non mi entra nella sub DataAvailable della Serial1. Quando per gli arriva una seconda stringa (sempre da Arduino) il software entra all’interno della sub ma non legge la stringa appena arrivata, legge quelle quella arrivata precedentemente.

Qualcuno ha avuto uno stesso problema o sa come potrei risolvere?

Grazie anticipatamente.

Puoi mostrare il codice eseguito nell’evento DataAvailable?

Certamente.
Eccolo:

if instr(me.LookAhead(encodings.ASCII), chr(13)+chr(10)) > 0 then

MsgBox ("Ricevuto")

TextField1.Text=Serial1.LookAhead(encodings.UTF8)

end if

Il problema per che il software alla prima stringa ricevuta non entra all’interno del DataAvailable.
Spero di essere stato sufficientemente chiaro.

Il problema e’ che, per quanto ho avuto modo di provare la gestione delle seriali, non estrarre tutti i dati dal buffer di ricezione impedisce la generazione del prossimo evento di DataAvailable.
Ti consiglio di leggere e memorizzare tutto quanto ricevuto in un buffer ed elaborare poi il contenuto del buffer.

Nota che questo comportamento non e’ strano e tipico solo di Xojo.
In molti sistemi e frameworks la notifica di “dati disponibili” non si scatena se quanto notificato precedentemente non e’ stato gestito mediante la completa lettura di tutto quanto ricevuto.

Saluti.

Per adesso grazie Maurizio.
Provo ad implementare un “buffer” d’appoggio al software, ma la domanda che mi sorge la seguente:
il buffer viene utilizzato anche in fase di trasmissione da Xojo ad Arduino?
Nel caso in cui la risposta alla domanda precedente sia negativa mi sorge un’altra domanda ancora:
se comunque non ho ancora utilizzato quella seriale, quindi di conseguenza non stato utilizzato il buffer, perch all’interno di quest’ultimo dovrebbe esserci qualcosa?

Non capisco le tue ultime domande e quindi il dubbio che hai.
Una nota: LookAhead non legge i dati, la lettura deve essere eseguita con Read o Readall.

Saluti.

Importante non bloccare il processo di DataAvailable.
Msgbox una pessima idea.
Meglio system.debuglog

In ogni caso il codice corretto da usare:
if instr(me.LookAhead(encodings.ASCII), chr(13)+chr(10)) > 0 then
TextArea1.Text=TextArea1.Text+Me.ReadAll(encodings.ASCII)
end if
Ovvero svuoti il buffer quando vedi un chr(13)

O autocitandomi dal forum: https://forum.xojo.com/22454-serial-port-glitch

[code]Sub DataAvailable()

Dim PacketSize As Integer?

Dim Terminator As String = ChrB(26) // This is the data terminator, in this case it is an EndOfFile, but could be multiple byte like CRLF (#0D0A)

PacketSize = InStrB(0, me.Lookahead, Terminator) - 1 // Check the buffer for at least one full packet. Instr returns the position of the first byte of the Terminator, so we subtract 1 to get the actual packet size
If PacketSize < 0 Then // Wait for at least one full packet
Return // Exit this routine
End If
Do
Dim DataPacket As String = me.Read(PacketSize) // Read the data packet without the terminator
Call me.Read(LenB(Terminator)) // Remove the terminator from the buffer
// Deal with the Data (DataPacket)
PacketSize = InStrB(0, me.Lookahead, Terminator) // Recheck the buffer for a full packet
Loop Until PacketSize < 0
End Sub[/code]