Public Function ricevi() As String
Dim s As String = ""
Dim str As String = ""
Do
Wait
if (allarme=false) then Read #serialport1, str, Lof(serialport1)
s = s & str
Loop Until (str <> Chr(13) Or allarme = True)
If allarme Then
Return MCost.SERIAL_TIMEOUT
Else
Return s
Endif
End
il loop riceve i caratteri dalla seriale finchè non arriva il fine stringa o si verifica i timeout
la lettura della seriale viene bloccata se allarme è true
Public Sub tmr_timeout_Timer()
Dim m As Integer
tmr_macchina.enabled = False ' ferma il timer della macchina a stati finiti
m = Message.Error("Errore timeout seriale", "Riprova", "Abbandona")
If m = 1 Then
tmr_macchina.enabled = True
Else
allarme = True
Me.close
Endif
End
il verificarsi del timeout interrompe il loop di controllo della seriale, ma nonostante che termini con me.close la funzione ricevii() prosegue e restituisce il controllo al ciclo che l'ha chiamata
in
Form_Close()
Serialport1.close()
end
per qualche motivo avveniva una nuova lettura -trasmissione sulla seriale che era già chiusa
il programma ora funziona, come detto prima si bloccava nel loop chiamante la lettura della seriale prima che avvenisse la chiusura del form, è bastato mettere nella condizione di uscita anche allarme= true
il dubbio però mi è rimasto
è possibile chiudere immediatamente il form all'interno dell'evento timeout senza che nessuna altra istruzione venga eseguita?
Il form è stato aperto da un altro form principale in modalotà showmodal()
Il progetto lo devo sistemare e rendere leggibile, l'ho sviluppato su raspberry con il display 7" e a furia di correzioni e modifiche è un "po" incasinato , lo sistemo e lo condivido