con questo codice dovresti ottenere una lettura pulita, dipend ecomunque dal codice che usi nello scema
Public Sub SPort_Read()
Dim s, $s As String
Dim i As Integer
Read #Sport, s, Lof(Sport)
s = Replace(s, "\r\n", "")
For i = 1 To Len(s)
$s = Mid(s, i, 1)
If $s = "#" Then
sbuf = ""
Else If $s = "!" Then
textbox1.text = sbuf
Else
sbuf &= $s
Endif
Next
End
sbuf è una variabile di tipo globale
aggiungi un delay(500)
dopo l' istruzione di invio dati alla seriale nello schema di arduino
io ad esempio ho usato:
Serial.write('#');
//int sensorValue = analogRead(A0);
Serial.println( analogRead(A1));
Serial.write('!');
delay(1000);
Magari riesco a capirci qualcosa anch'io.....
Come si gestisce la lettura della porta seriale?
In pratica, se io con Arduino trasmetto la stringa:
forseperchèdellafatelquietetuseil'immagoamesicaravieniosera.
Nella routine SPortRead ho inserito questo codice:
TextArea1.Text = TextArea1.Text & "#"
Il risultato nella mia TextArea è il seguente:
forse#per#chèdellafatelquietetuseil'i#mma#goam#esicaravie#niosera.
Premettendo che Arduino mi trasmette i caratteri di continuo, non ci sono "strane" temporizzazioni.
Mi verrebbe da fare così:
MioBufferSeriale = MioBufferSeriale & s
e con un timer, dopo 5-6 secondi, vado a stampare MioBufferSeriale nella TextArea1.
Ma non mi sembra il massimo dell'efficienza.
Il tutto senza andare a scomodare il controllo della seriale (DTR/RTC/CTS etc. etc.).
Quale sarebbe il metodo più efficiente?
Non riesco ad aprire il file:
Si è verificato un errore durante il caricamento dell'archivio.
tar: unrecognized option '--no-wildcards'
Try `tar --help' for more information.
Quello che vorrei sapere è perchè il buffer della seriale mi legge un numero di caratteri variabile: al primo passaggio mi ritrovo solo la stringa "forse", poi mi arriva la stringa "per", poi quella "chèdellafatalquietetuseil'i".... e così via.
Comunque, adesso mi compare l'errore
gambas gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed
Ipotizzo che sia perchè mi arrivino alla porta seriale caratteri nulli (00h) che però devo riuscire a leggere.
Cercando ho trovato questo:
' Watching a serial port
DIM hFile AS File
hFile = OPEN "/dev/ttyS0" FOR READ WRITE WATCH
...
PUBLIC SUB File_Read()
DIM iByte AS Byte
READ #hFile, iByte
PRINT "Got one byte: "; iByte
END
Ma non ho alba di come implementarlo per effettuare la lettura in tempo reale.
Purtroppo dal lato di trasmissione la cosa non la gestisco io; a volte vengono trasmesse delle stringhe (quindi c'è spesso una pausa), a volte mi vengono trasmessi blocchi da 2-3 KByte.
Attualmente ho impostato un timer che viene azzerato a ogni ricezione, quando smette di trasmettere (dopo 500 ms) mi entra nel timer e lì vado a leggere il buffer di ricezione.
Il problema lo trovo quando mi trasmette i blocchi da 2 kBytes, non so se per la dimensione del blocco o se è perchè mi trasmette tanti caratteri nulli, anche consecutivi.
Non so in base a cosa, ma con il codice fornito nell'esempio
Public Sub SPort_Read()
Dim s As String
Read #Sport, s, Lof(Sport)
riuscivo a leggere massimo circa 80-100 Bytes (anche senza andarli veramente a leggere, se mettevo un semplice contatore, mi raggiungeva questi valori).
Poi ho provato questo codice che ho trovato nella lettura di un socket TCP:
WHILE Lof(LAST) > 0
READ #Sport, s, 1
RxData[ByteCount] = Asc(s,1)
ByteCount += 1
WEND
Non capisco esattamente che differenza ci sia tra i due (se è per il fatto che nel calcolo della lunghezza di una stringa più caratteri nulli mi creano problemi), ma così mi funziona molto meglio.