Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - creare una bussola
Forum - C# / VB.NET - creare una bussola - Pagina 11

Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 17:33
Mercoledì, 27/03/2024
questa è la finestra di output


nightwolf ha allegato un file: errore1.png (186147 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:17
Mercoledì, 27/03/2024
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

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.     Dim str As String = RiceviDati()
  3.  
  4.     ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
  5.     ListBox1.TopIndex = ListBox1.Items.Count - 1
  6.     ListBox1.HorizontalScrollbar = True
  7. 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
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 19:05
Mercoledì, 27/03/2024
EDIT

Ho aggiunto una riga che converte i ritorni accapo in \n, in modo che possano essere individuati

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.       Dim str As String = RiceviDati()
  3.  
  4.        str = str.Replace(vbCrLf, "\n")
  5.        ListBox1.Items.Add(DateTime.Now.ToLongTimeString & " - str = " & str)
  6.        ListBox1.TopIndex = ListBox1.Items.Count - 1
  7.        ListBox1.HorizontalScrollbar = True
  8. End Sub



Posta lo screenshot

Ultima modifica effettuata da Carlo il 27/03/2024 alle 19:07


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 19:50
Mercoledì, 27/03/2024
nel timer2 ho aggiunto soltanto il codice di verifica così da vedere il risultato


nightwolf ha allegato un file: errore2.png (122440 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1364
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 21:09
Mercoledì, 27/03/2024
Testo quotato

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
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 21:24
Mercoledì, 27/03/2024
Ok
Grazie mille provo e faccio sapere

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2316
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:20
Giovedì, 28/03/2024
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

  1. string[] esempio = new string[] { "-322.54;50-322.30",";50-322.30;","50-322.20;" };
  2.  
  3.  
  4. //Ottengo un valore casuale dalla stringa esempio.
  5.             Random rn = new Random();
  6.             string lettura = esempio[rn.Next(0, esempio.Length)];
  7.  
  8.  
  9.             //Splitto la stringa con l'identificatore delle linee
  10.             string[] ln = lettura.Split('-');
  11.  
  12.             //Divisa la stringa divido ulteriormente il valore per controllare
  13.             //effettivamente se ci sono i due campi che mi interessano
  14.  
  15.             //Ottengo la prima stringa possibile contenente il carattere ;
  16.             string val = ln.Where(x => x.Contains(";")).FirstOrDefault();
  17.  
  18.             //Divido ancora la stringa per controllare se ci sono i due campi
  19.             string[] val2 = val.Split(';');
  20.  
  21.             //Se la stringa contiene due campi
  22.  
  23.             int bussola = 0;
  24.             int potenziometro = 0;
  25.  
  26.             if (val2.Length == 2)
  27.             {
  28.                 if (val2[0].Length > 1 && val2[1].Length > 1)
  29.                 {
  30.                     //Se entrambi i campi hanno un valore,
  31.                     int.TryParse(val2[0].Split('.')[0], out bussola);
  32.                     int.TryParse(val2[1], out potenziometro);
  33.  
  34.  
  35.                     MessageBox.Show("Bussola Vale: " + bussola);
  36.                     MessageBox.Show("Potenziometro Vale:" + potenziometro);
  37.                 }
  38.  
  39.             }





https://dotnetfiddle.net/NCCtyX


Quando l'output è bianco significa che salta la riga, quando mostra i valori,
Ha correttamente diviso la riga.


Ultima modifica effettuata da Thejuster il 28/03/2024 alle 10:24


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 12:39
Giovedì, 28/03/2024
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

  1. 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

  1. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  2.         Prova()
  3.     End Sub
  4.     Private Shared Sub Prova()
  5.         Dim rn As Random = New Random()
  6.         Dim lettura As String = esempio(rn.[Next](0, esempio.Length))
  7.         Dim ln As String() = lettura.Split("-"c)
  8.         Dim val As String = ln.Where(Function(x) x.Contains(";")).FirstOrDefault()
  9.         Dim val2 As String() = val.Split(";"c)
  10.         Dim bussola As Integer = 0
  11.         Dim potenziometro As Integer = 0
  12.  
  13.         If val2.Length = 2 Then
  14.  
  15.             If val2(0).Length > 1 AndAlso val2(1).Length > 1 Then
  16.                 Integer.TryParse(val2(0).Split("."c)(0), bussola)
  17.                 Integer.TryParse(val2(1), potenziometro)
  18.                 Console.WriteLine("Bussola Vale: " & bussola)
  19.                 Console.WriteLine("Potenziometro Vale:" & potenziometro)
  20.             End If
  21.         End If
  22.     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.

PM Quote
Pagine: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] Precedente | Prossimo