
nightwolf (Normal User)
Pro
    
Messaggi: 153
Iscritto: 14/09/2010
|
questa è la finestra di output
|
|

Carlo (Member)
Guru^2
    
Messaggi: 1431
Iscritto: 29/01/2018
|
Sembra che stai ricevento più stringhe contemporaneamente separate dal ritorno accapo.
metti una listBox al posto della textBox e allargala bene in modo da vedere cosa ricevi:
Codice sorgente - presumibilmente VB.NET |
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick Dim str As String = RiceviDati() ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str) ListBox1.TopIndex = ListBox1.Items.Count - 1 ListBox1.HorizontalScrollbar = True End Sub
|
nella ListBox1 avrai quello che ricevi identificato dal tempo.
Posta lo screenshot
Ultima modifica effettuata da Carlo il 27/03/2024 alle 18:45
in programmazione tutto è permesso |
|

Carlo (Member)
Guru^2
    
Messaggi: 1431
Iscritto: 29/01/2018
|
EDIT
Ho aggiunto una riga che converte i ritorni accapo in \n, in modo che possano essere individuati
Codice sorgente - presumibilmente VB.NET |
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick Dim str As String = RiceviDati() str = str.Replace(vbCrLf, "\n") ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str) ListBox1.TopIndex = ListBox1.Items.Count - 1 ListBox1.HorizontalScrollbar = True End Sub
|
Posta lo screenshot
Ultima modifica effettuata da Carlo il 27/03/2024 alle 19:07
in programmazione tutto è permesso |
|

nightwolf (Normal User)
Pro
    
Messaggi: 153
Iscritto: 14/09/2010
|
nel timer2 ho aggiunto soltanto il codice di verifica così da vedere il risultato
|
|

Carlo (Member)
Guru^2
    
Messaggi: 1431
Iscritto: 29/01/2018
|
Postato originariamente da nightwolf:
nel timer2 ho aggiunto soltanto il codice di verifica così da vedere il risultato |
Certo il resto non serve finquando la ricezione non sia ottimizzata.
Come vedi il buffer si riempie perché arduino invia i dati 3 o 4 volte al secondo e tu li leggi una volta al secondo.
Prima prova ad abbassare l'interval di timer2, da 1000 portalo a 500, 250, 100 e controlla.
A naso se abbassando l'interval su timer2 riesci ad avere una ricezione pulita al 90%, ti puoi accontentare. Gli eventuali sporadici dati errati si possono gestire. Già così la ricezione è usabile, ma bisognerebbe buttare le letture superflue che invece potrebbero essere usate per rendere il movimento della bussola più fluido.
Se invece ritieni che timer2 a un secondo sia sufficiente, devi cambiare sul codice C di arduino nella routine loop, il delay che ora sta a 200, mettilo a 300, 400, 500... e controlla.
Se nella ListBox1, hai tutte letture pulite e senza \n, il codice che ti avevo proposto è valido, altrimenti va modificato.
Ultima modifica effettuata da Carlo il 27/03/2024 alle 21:10
in programmazione tutto è permesso |
|

nightwolf (Normal User)
Pro
    
Messaggi: 153
Iscritto: 14/09/2010
|
Ok
Grazie mille provo e faccio sapere
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2339
Iscritto: 04/05/2008
|
A questo punto direi di procedere in due modi.
1) Aggiungere un terminatore di riga
2) Scrivere una funzione apposta per l'invio dei dati
Se invio esempio:
-Bussola;Potenziometro
ho l'identificatore della riga che inizia con -
Quindi sò che ogni volta che andrò a splittare la stringa con "-" avrò un una riga completa.
Ora, che ne salta una, o due poca importa.
L'importante è avere una lettura corretta almeno in un range di tot secondi.
quindi poniamo il caso che ho:
1° Caso
-322.54;50-322.30
2° Caso
;50-322.30;
3° Caso
50-322.20;
Faccio degli esempi random.
con possibili vedute di errori di stringa.
per poi correggere in questo modo
Codice sorgente - presumibilmente C# / VB.NET |
string[] esempio = new string[] { "-322.54;50-322.30",";50-322.30;","50-322.20;" };
//Ottengo un valore casuale dalla stringa esempio.
Random rn = new Random();
string lettura = esempio[rn.Next(0, esempio.Length)];
//Splitto la stringa con l'identificatore delle linee
string[] ln = lettura.Split('-');
//Divisa la stringa divido ulteriormente il valore per controllare
//effettivamente se ci sono i due campi che mi interessano
//Ottengo la prima stringa possibile contenente il carattere ;
string val = ln.Where(x => x.Contains(";")).FirstOrDefault();
//Divido ancora la stringa per controllare se ci sono i due campi
string[] val2 = val.Split(';');
//Se la stringa contiene due campi
int bussola = 0;
int potenziometro = 0;
if (val2.Length == 2)
{
if (val2[0].Length > 1 && val2[1].Length > 1)
{
//Se entrambi i campi hanno un valore,
int.TryParse(val2[0].Split('.')[0], out bussola);
int.TryParse(val2[1], out potenziometro);
MessageBox.Show("Bussola Vale: " + bussola);
MessageBox.Show("Potenziometro Vale:" + potenziometro);
}
}
|
Ultima modifica effettuata da Thejuster il 28/03/2024 alle 10:24
|
|

nightwolf (Normal User)
Pro
    
Messaggi: 153
Iscritto: 14/09/2010
|
ok, ho capito quello che vuoi dire, ma in visual basic come avverrebbe tutto ciò? ho fatto la conversione del codice e nell output c'è solo la divisione della stringa, non riceve niente da arduino. l ho tradotto così se è giusto
Codice sorgente - presumibilmente C# / VB.NET |
Shared esempio As String() = New String() {"-322.54;50-322.30", ";50-322.30;", "50-322.20;"}
|
e poi dentro timer2
Codice sorgente - presumibilmente VB.NET |
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick Prova() End Sub Private Shared Sub Prova() Dim rn As Random = New Random() Dim lettura As String = esempio(rn.[Next](0, esempio.Length)) Dim ln As String() = lettura.Split("-"c) Dim val As String = ln.Where(Function(x) x.Contains(";")).FirstOrDefault() Dim val2 As String() = val.Split(";"c) Dim bussola As Integer = 0 Dim potenziometro As Integer = 0 If val2.Length = 2 Then If val2(0).Length > 1 AndAlso val2(1).Length > 1 Then Integer.TryParse(val2(0).Split("."c)(0), bussola) Integer.TryParse(val2(1), potenziometro) Console.WriteLine("Bussola Vale: " & bussola) Console.WriteLine("Potenziometro Vale:" & potenziometro) End If End If End Sub
|
e nell output viene fuori
Bussola Vale: 50
Potenziometro Vale: 322
mentre tornando a l vecchio codice ho provato ad abbassare l intervall di timer2 a 500 e 250, e niente, stesso errore. ho prvato anche a portare il delay di arduino che prima era a 300 di portarlo a 500 come timer2, ed è lo stesso errore. |
|