Oppure

Loading
27/03 16:26
nightwolf
ho provato ad andare step by step, togliendo la parte di codice che riguarda il volume, il programma funziona senza nessun errore, ma la bussola non si muove, quando vado ad inserire la parte di codice riguardante valoriDivisi(1), quest ultimo è come se memorizzasse valoreDivisi(0) senza splittarlo.
aaa
27/03 16:33
nightwolf
questa è la finestra di output
aaa
27/03 17:17
Carlo
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:

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 27/03 17:45
in programmazione tutto è permesso
27/03 18:05
Carlo
EDIT

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

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 27/03 18:07
in programmazione tutto è permesso
27/03 18:50
nightwolf
nel timer2 ho aggiunto soltanto il codice di verifica così da vedere il risultato
aaa
27/03 20:09
Carlo
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 27/03 20:10
in programmazione tutto è permesso
27/03 20:24
nightwolf
Ok
Grazie mille provo e faccio sapere
aaa
28/03 9:20
Thejuster
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


 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);
                }

            }





dotnetfiddle.net/…


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

Ultima modifica effettuata da Thejuster 28/03 9:24
mire.forumfree.it/ - Mire Engine
C# UI Designer