Accedendo alla porta seriale i 16 byte che devo leggere mi arrivano non di seguito.
L'accesso alla porta lo eseguo con il componente SerialPort così:
Public Sub SerialPort1_Read()
Dim i As Integer
Dim millisec As String
While Not Eof(SerialPort1)
Read #SerialPort1, b
s = CStr(b)
If b < 99 Then s = 0 & s
If b < 10 Then s = 0 & s
millisec = Right$(CString(Now), 3)
ss = ss & s ' compongo la stringa "sommando" i byte
Print s & " " & millisec
' For i = 1 To 50000 ' impongo un ritardo altrimenti salto dei byte
' Next
Wend
TextArea2.Text = ss
Split_byte(ss) 'chiamata alla subroutine Split_byte
ss = "" 'dopo aver mandato la stringa ss alla subroutine, qui viene "azzerata"
End
'###################################
I byte sono 16 e i tempi di acquisizione risultano
042 796
062 806
000 806
000 806
076 806
065 806
083 806
079 806
078 815
069 815
065 815
087 815
082 815
082 815
000 815
000 815
Se tolgo il commento alle istruzioni:
' For i = 1 To 50000 ' impongo un ritardo altrimenti salto dei byte
' Next
allora diventano:
042 719
062 736
000 746
000 766
076 775
065 802
083 822
079 .84
078 843
068 858
065 861
087 869
082 873
082 886
000 894
000 904
Il pacchetto di 16 byte è spedito correttamente, nel senso che con l'oscilloscopio ( e perdendo quasi la vista) ho ricostruito tutti i singolo bit e non ci sono anomalie sui tempi e sui bit di start e stop!
Sbaglio qualcosa o il componente SerialPort ha qualche problema?
Quello che non mi piace è che nel primo caso ci sono ben 3 EoF per catturare 16 byte che arrivano da una periferica che li spedisce tutti insieme.
E' chiaro che se attendo un tempo sufficiente creo un EoF per ogni byte che ricevo, ma questa soluzione è "poco pulita"!
Mi viene da pensare ad un bug del componente SerialPort
Ho tentato allora di accedere alla porta così
Private fl As File
Public Sub Button1_Click()
fl = Open "/dev/ttyUSB0" For Read Watch
End
Public Sub File_Read()
Dim b As Byte
' legge i dati "grezzi" provenienti dal file-device....
Read #fl, b
'...e li mostra in console:
Print b
End
come suggerito da Vuott, ma non funziona forse perchè la porta va settata (velocità bit stop ecc)..e non ho trovato info su come si fa :-\
Se vado a leggere invece il file-device /dev/ttyUSB1, riesco a leggerlo, ed ottengo i medesimi dati, sia con il programma SerialPort (il quale li organizza ovviamente per benino leggibili in una TextArea), sia con l'algoritmo di lettura diretta ebrutale del file-device che ti ho suggerito.
Sono tornato su questa cosa, e ho visto che rispetto al programma SerialPort 3.0.0 si ottiene identico risultato visivo :D delle righe di dati, intercettati dalla porta, raccogliendoli come stringhe:
Public Sub File_Read()
Dim s As String
While Not Eof(fl)
' legge i dati "grezzi" come stringhe provenienti dal file-device....
Read #fl, s, -256
'...oppure ovviamente anche così:
' Line Input #fl, s
'...e li mostra in console:
Print s
Wend
End
Quindi un'altra maniera per aprire e leggere la porta seriale ttyUSB1 può essere anche quella che utilizza la funzione .RunAsRoot() della classe Desktop. Detta funzione di gambas ti consente di lanciare un comando bash con password senza uso di Shell.
E' necessario impostare anche il componente gb.desktop:
Private fl As File
Private sFile As String
Public Sub Form_Open()
' Utilizziamo un file temporaneo d'appoggio:
sFile = Temp$()
Desktop.RunAsRoot("cat /dev/ttyUSB1 > " & sFile)
Do
Wait 0.1
Loop Until Exist(sFile)
fl = Open sFile For Read Watch
End
Public Sub File_Read()
Dim s As String
s = File.Load(sFile)
Print s
End