Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [VB.NET] Eseguire istruzioni quando ricevo dati da seriale

    Salve a tutti,sto ultimando un progetto scolastico per l'esame di stato, in cui ricevo tramite seriale dei valori ottenuti da un sistema (hardware) e che rielaboro e presento tramite computer.

    In caso dovesse servire: il programma presenta in tempo reale il valore di alcune bande audio, selezionate da un file mp3 in riproduzione e le mette in un grafico in tempo reale, come si vede sugli stereo, insomma.

    Dopo varie ore passate a comprendere il vb.net (ho sempre usato vb6), sono riuscito a completare tutto, tranne 1 cosa:
    mi era stato dato da un mio professore lo stesso programma fatto in VB6, che usava per chiamare tutte le operazioni l'evento OnComm della porta seriale, cioè ogni volta che ricevevo qualcosa eseguivo delle operazioni.
    Adesso, in vb.net, non riesco a fare la stessa cosa, mi spiego:
    ho provato ad usare l'evento "DataReceived", che (se non mi sbaglio) dovrebbe fare la stessa identica cosa: solo che, usando questo evento, ricevo l'errore "Cross-thread operation not valid: Control 'PanB' accessed from a thread other than the thread it was created on." Ho cercato un po' su google ma non riesco a risolvere il problema...

    Quindi vi chiedo: sapete come risolvere il problema, o come usare un evento analogo? Oppure, c'è un modo per leggere i dati in polling, ad esempio attraverso una sorta di timer? (In questo caso, ho provato il timer standard di vb.net, ma causa problemi in quanto non è abbastanza veloce/preciso)

    i dati ricevuti dalla seriale sono in forma "S numero numero numero numero E": pseudo-bit di start, 4 valori e uno pseudo-bit di stop
    "graf", è un Chart di VB, e panb,panmb,panma,pana, sono dei Panel che stanno ad indicare, in sincronia col grafico, il livello ricevuto dalla seriale.

    allego in code il codice attuale

    Contrassegno con un "!!!!" le righe dove avviene l'errore
    codice:
    Private Sub SP1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SP1.DataReceived
            'For i = 0 To 5
            '    dato = SP1.ReadLine
            'Next
            dato = SP1.ReadLine
            str = dato
            strArr = str.Split(" ")
            For i = 0 To strArr.Length - 1
                Select Case i
                    Case 0 : inizio = strArr(i)
                    Case 1 : d1 = strArr(i)
                    Case 2 : d2 = strArr(i)
                    Case 3 : d3 = strArr(i)
                    Case 4 : d4 = strArr(i)
                    Case 5 : fine = strArr(i)
                End Select
            Next
            If inizio = "S" And fine = "E" & vbCr & "" Then
                If IsNumeric(d1) = True And IsNumeric(d2) = True And IsNumeric(d3) = True And IsNumeric(d4) = True Then
                    If conta < 200 Then
                        conta = conta + 1
                    Else
                        For i = 0 To 6
                            graf.Series(i).Points.Clear()
                        Next
                        conta = 0
                    End If
                    graf.Series.Clear()                                 "!!!!"                          
    
                    bassi.Points.AddXY(conta, d1)
                    mediobassi.Points.AddXY(conta, d2)
                    medioalti.Points.AddXY(conta, d3)
                    alti.Points.AddXY(conta, d4)
    
                    PanB.Height = (d1 * 1) + 1                         
                    PanB.Top = 100 - (d1 * 1) + 1
                    PanB.Location = New System.Drawing.Point(12, 460 - PanB.Height)
                    PanMb.Height = (d2 * 1) + 1              
                    PanMb.Top = 100 - ((d2) * 1) + 1
                    PanMb.Location = New System.Drawing.Point(68, 460 - PanMb.Height)
                    PanMa.Height = (d3 * 1) + 1            
                    PanMa.Top = 100 - (d3 * 1) + 1
                    PanMa.Location = New System.Drawing.Point(124, 460 - PanMa.Height)
                    PanA.Height = (d4 * 1) + 1               
                    PanA.Top = 100 - (d4 * 1) + 1
                    PanA.Location = New System.Drawing.Point(180, 460 - PanA.Height)
    
                    ref.Points.AddXY(200, 0)
                    graf.Series.Add(ref)
                    ref1.Points.AddXY(200, 1)
                    graf.Series.Add(ref1)
                    ref2.Points.AddXY(200, -1)
                    graf.Series.Add(ref2)
                    graf.Series.Add(bassi)
                    graf.Series.Add(mediobassi)
                    graf.Series.Add(medioalti)
                    graf.Series.Add(alti)
                End If
            End If
        End Sub

  2. #2
    Utente di HTML.it L'avatar di Vinsent
    Registrato dal
    May 2011
    Messaggi
    314
    Detto in termini "miei"...stai utilizzando più thread e tra di loro non puoi avviare le rispettive routine...più o meno....
    Puoi provare ad usare Delegate/Invoke, leggi qui:
    http://msdn.microsoft.com/it-it/libr...(v=vs.90).aspx
    e vedi se può esserti utile.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.