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

Rispondi quotando
