Visualizzazione dei risultati da 1 a 8 su 8

Discussione: RS232 VB.net

  1. #1

    RS232 VB.net

    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 Class
    codice:
    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

  2. #2

    Moderazione

    Le discussioni relative a VB.NET non sono trattate qui, ma nell'apposita sottosezione.

    Provvedo a spostare il thread.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ciao
    Potresti dare un'occhio alla classe StopWatch e vedere se fa al caso tuo ma, più semplicemente, visto che nel codice ne hai già fatto uso, fai partire un Timer con cadenza di 1 secondo e leggi(ed elabori) il valore di una variabile intera che incrementi ad ogni lettura dalla seriale.

    Ciao

  4. #4
    inanzitutto grazie della risposta.

    pero come si fa a mettere come cadenza 1 secondo?

    la sintassi quale è ?

  5. #5
    Devi valorizzare la proprietà "INTERVAL" del timer espressa in ms ... quindi, 1s = 1000.
    Poi nell'evento Tick del timer elabori la variabile di conteggio delle letture.

  6. #6
    perfetto...

    grazie mille ...

    poi basta che richiamo il timer all 'interno del ciclo?

  7. #7
    Lo abiliti e lo disabilita all'occorrenza con l'istruzione
    codice:
    TuoTimer.Enable=true
    o
    codice:
    TuoTimer.Enable=false

  8. #8
    grazie dell' aiuto

    sei stato molto gentile...


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.