ciao a tutti.
avrei bisogno di un aiuto su questo progettino in Visual Basic.net che ho fatto.
vi spiego un attimino come funziona.
l' obbiettivo è quello di rilevare la misura che mi da lo strumento tramite l' interfaccia RS232.
questa operazione mi riesce bene, ma non riesco a capire come poter contare le misure nell'arco di 1 secondo.
praticamente le misure le rilevo e infatti le stampo in una textbox, ma mi manca il fatto di contarlo nell ' arco di un secondo.
se vedete c' è il ciclo per rilevare le misure
grazie in anticipo
vi post il codice:
UTILIZZO DEI THREAD:
codice:Public Class ProvaThread 'variabile del ciclo continuo del Thread Private CicloThread As Boolean = False 'dichiaro la classe thread che andrò a gestire --> thread principale di sistema Private Thread_Di_Sistema As System.Threading.Thread 'dichiaro una variabile in cui memorizzo lo stato del thread Public StatoThread As Boolean = False 'dichiaro una variabile buffer dove andrò a memorizzare i dati che ricevo dalla porta seriale Private buffer As String = "" 'dichiaro una variabile valore dove andrò a memorizzare la misura Public valore As Double = 0 'dichiaro una variabile StatoConnessione per verificare se la connessione con lo strumenta e aperta o meno Public StatoConnessione As Boolean = False 'creo la classe ce andrà a gestire la porta seriale DMX-1 Private PortaComDMX As IO.Ports.SerialPort Public Sub PRINCIPALE_THREAD() 'thread che gestisce l'apertura della porta COM1 'richiamo la classe a cui andrò a associare tutti i valori della porta seriale PortaComDMX = New IO.Ports.SerialPort 'verifichiamo che non si siano problemi Try 'imposto le caratteristiche che voglio della porta seriale PortaComDMX.PortName = "COM1" PortaComDMX.BaudRate = 9600 PortaComDMX.DataBits = 8 PortaComDMX.Parity = IO.Ports.Parity.None PortaComDMX.StopBits = IO.Ports.StopBits.One PortaComDMX.ReadTimeout = 10000 PortaComDMX.WriteTimeout = 10000 PortaComDMX.DtrEnable = True PortaComDMX.RtsEnable = True PortaComDMX.ReceivedBytesThreshold = 1 PortaComDMX.Handshake = IO.Ports.Handshake.None 'dopo di che apro la porta PortaComDMX.Open() 'pulisco i buffer di memoria per evitare che rimanga qualcosa salvato in memoria PortaComDMX.DiscardInBuffer() PortaComDMX.DiscardOutBuffer() Catch ex As Exception 'scrivo errore MsgBox("Errore Apertura Porta : " + ex.Message) End Try StatoThread = True StatoConnessione = True ' imposto un tempo di attesa per dare tempo al thread di eseguire il ciclo do Threading.Thread.Sleep(500) Do Try 'invio 1 + lo spazio alla porta seriale come richiede lo strumento PortaComDMX.Write("1" + vbCr) Do 'eseguo il controllo per capire se effettivamente lo strumento mi risponde If PortaComDMX.BytesToRead > 0 Then 'se ci sono dati carico tutto nella variabile buffer buffer &= PortaComDMX.ReadExisting End If 'do un tempo di attesa per fare in modo che il thread risponda bene Threading.Thread.Sleep(2) 'il ciclo continua fino a quando nella variabile buffer non compare il ritorno a capo Loop While buffer.Contains(vbCr) = False 'utilizzo la funzione replace per fare in modo di eliminare la stringa 010 davanti alla misura buffer = buffer.Replace("01A", "") 'converto la stringa in double e assegno tutto ciò che c'è nel buffer a valore Double.TryParse(buffer, valore) 'a questo punto posso svuotare il buffer buffer = "" Catch ex As Exception MsgBox("Errore : " + ex.Message) End Try 'funzione per fare in modo che il thread lavori correttamente (tempo di attesa) Threading.Thread.Sleep(1) 'la lettura dei valori continua fino a quando il ciclo non diventa FALSE premendo il pulsante STOP Loop While CicloThread = True 'chiudo la porta per evitare che rimanga appesa PortaComDMX.Close() 'imposto questa variabile False in modo da poter concludere la sub StopThread ed eseguire il comando Abort StatoThread = False StatoConnessione = False End Sub #Region "INIZIO E FINE THREAD" Public Sub INIZIO_THREAD() 'Thread di Start 'esecuzione del thread di inizio. (faccio partire il thread) 'durante l' esecuzione chiedo che il tutto venga indirizzato al PRINCIPALE_THREAD 'per poter aprire la porta COM1 CicloThread = True Thread_Di_Sistema = New System.Threading.Thread(AddressOf PRINCIPALE_THREAD) Thread_Di_Sistema.Start() End Sub Public Sub FINE_THREAD() 'Thread di fine CicloThread = False Do 'imposto un tempo di attesa di mezzo secondo Threading.Thread.Sleep(500) Loop While StatoThread = True 'blocco il thread per consentire la chiusura Thread_Di_Sistema.Abort() End Sub #End Region End Classcodice:Public Class Form1 'CollegamentoThread è la variabile di collegamento tra il Form e la classe thread Private CollegamentoThread As ProvaThread = New ProvaThread Private Sub ApriPorta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ApriPorta.Click 'tramite la variabile CollegamentoThread richiamo il thread INIZIO_THREAD per far partire il tutto CollegamentoThread.INIZIO_THREAD() End Sub Private Sub ChiudiPorta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChiudiPorta.Click 'tramite la variabile CollegamentoThread richiamo il thread FINE_THREAD per terminare il tutto CollegamentoThread.FINE_THREAD() End Sub Private Sub AggiornaDati_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles AggiornaDati.Tick 'se lo stato del thread è uguale a true allora prendo i dati dello strumento e li scrivo sulla casella di testo If CollegamentoThread.StatoThread = True Then Me.TextBoxMisuraDMX.Text = FormatNumber(CollegamentoThread.valore, 3) Me.TextBoxFineValore.Text = "" Me.TextBoxStatoConnessione.BackColor = Color.Lime Else 'altrimenti non sto acquisendo dati e quindi chiudo la porta Me.TextBoxMisuraDMX.Text = "" Me.TextBoxFineValore.Text = "La porta è chiusa" Me.TextBoxStatoConnessione.BackColor = Color.Red End If If CollegamentoThread.valore = 911 Then 'verifico che se lo strumento e spento o collegato coloro la casella di blu Me.TextBoxStatoConnessione.BackColor = Color.Blue Me.TextBoxMisuraDMX.Text = "" End If End Sub End Class

Rispondi quotando