Oppure

Loading
26/03 7:47
Carlo
Se metti il puntoevirgola come separatore su arduino, lo devi mettere anche in vb.
Se metti i duepunti in arduino li devi mettere anche in vb.
Non c'è nulla da provare.

L'errore lo hai perché trasmetti sulla seriale di arduino in modo temporizzato e ricevi sulla seriale del Pc in modo temporizzato ma non sincronizzato.
Le letture si susseguono e può capitare che vai a leggere quando arduino sta scrivendo e la stringa non è completa. Per evitarlo bisogna stabilire una comunicazione sincrona e con convalida.
Troppo complicato per questo progetto è sufficiente analizzare il dato da vb e cercare di verificarne la congruità.

Se leggi le segnalazioni degli errori è tutto chiaro cosa è successo, nel primo caso è stato ricevuto "B;B" e in valoriDivisi(1) ci è andata la B che non si può convertire in intero. Nel secondo caso è stato ricevuto "B;286.91P" e in valoriDivisi(1) ci è andato 286.91P che non si può convertire in intero.

Verifiche da fare in Vb prima di usare il dato:
1) controllare che la stringa contenga un puntovirgola
2) controllare che il valore in valoriDivisi(1) sia numerico prima di convertirlo, oppure usare tryParse()
se non bastasse
3) controllare che la stringa B sia lunga 8 caratteri
4) che la stringa P non sia più lunga di 5 caratteri
5) che il valore di P sia tra 0 e 100

Lo sai fare?
Ultima modifica effettuata da Carlo 26/03 8:19
in programmazione tutto è permesso
26/03 10:29
nightwolf
Allora, partiamo con ordine,
- sia arduino e vb hanno il ;
- B; ha come valore che va da 0 a 360 gradi con i decimali.
-P; ha come valore che va da 0 a 100 x il livello del volume numeri interi senza decimali.
Per il resto non so neanche che sia tryparse, mai visto e mai usato. Posso cercare di modificare il codice di arduino per inviare B; con numeri interi ma non so quanto possa servire se nel codice di vb si è messo la sostituzione del punto con la , decimale.
aaa
26/03 14:36
nightwolf
Ho letto che il metodo tryparse vb converte in stringa i numeri decimali arrotondandoli, e se incontra delle lettere e vb non riesce a convertirle anziché dare errore da come valore 0. Giusto? :-|
aaa
26/03 15:11
Thejuster
Ti avevo proposto circa 10 post fa come risolvere.

1° Invia tutto in una sola riga.
2° Non usare sinonimi o altro per indicare i valori. Tanto le posizioni le conosci.
3° Splitta la stringa ed esamina l'array

Arduino invierà

355.20;36


L'applicazione riceve

335.20;36

Splitta ' ; '


Array(0) Elemento 0 contiene i dati della bussula
Array(1) Contiene i dati del potenziometro.

Stop.

Non usare ne P ne B e altrie cose inutili che oltre ad appesantire la stringa non servono a niente.

una volta splittato il contenuto sai che al 0 c'è la bussola all'1 il potenziometro. fine.
mire.forumfree.it/ - Mire Engine
C# UI Designer
26/03 15:25
Carlo
Postato originariamente da Thejuster:

Ti avevo proposto circa 10 post fa come risolvere.

1° Invia tutto in una sola riga.
2° Non usare sinonimi o altro per indicare i valori. Tanto le posizioni le conosci.
3° Splitta la stringa ed esamina l'array

Arduino invierà

355.20;36


Gli ho corretto anche il codice in C per arduino per fare quello che dici tu, l'ho postato alle 9:57 di Sabato 23/03/2024.
in programmazione tutto è permesso
26/03 15:46
nightwolf
Ok, mi andrò a riguardare i post precedenti e modifichero il codice di arduino, per l invio di un unica stringa che conterrà la bussola;potenziometro
aaa
26/03 16:20
Carlo
Postato originariamente da nightwolf:

Allora, partiamo con ordine,
- sia arduino e vb hanno il ;
- B; ha come valore che va da 0 a 360 gradi con i decimali.
-P; ha come valore che va da 0 a 100 x il livello del volume numeri interi senza decimali.
Per il resto non so neanche che sia tryparse, mai visto e mai usato. Posso cercare di modificare il codice di arduino per inviare B; con numeri interi ma non so quanto possa servire se nel codice di vb si è messo la sostituzione del punto con la , decimale.


Ok non lo sai fare.
Ecco il codice da mettere nel timer (leggi i rem):
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    Dim str As String
    str = RiceviDati()
    TextBox1.Text += str ' tuo monitor

    Dim valoriDivisi() As String ' matrice senza dimensione
    valoriDivisi = str.Split(";") ' puntovirgola separa le stringhe: in valoriDivisi(0) ci va il codice identificativo (B = gradi bussola, P = potenziometro, N = null, E = errore) e in valoriDivisi(1) ci va il valore relativo
    If valoriDivisi.Length <> 2 Then Exit Sub ' se str non è stato diviso in due stringhe si esce
    If valoriDivisi(0) = "B" Then
        ' Il dato è riferito ai gradi della bussola
        ' se la conversione è possibile avanzamento prende il valore dei primi tre caratteri della stringa
        If Integer.TryParse(valoriDivisi(1).Substring(0, 3), avanzamento) Then 
            lblgradi.Text = avanzamento.ToString("000°")
            Pcboxbussola.Invalidate() ' scatena il paint
        End If
    End If

    If valoriDivisi(0) = "P" Then
        ' Il dato in: valoriDivisi(1), è riferito al volume e è una stringa
        Dim controllo As Integer
        ' se la conversione è possibile, controllo prende il valore della stringa in valoriDivisi(1)
        If Integer.TryParse(valoriDivisi(1), controllo) Then
            If controllo >= 0 And controllo <= 100 Then ' se il valore è nel range 0-100 si imposta il volume
                media_pleyer.lb_volume.Text = valoriDivisi(1) + "%"
                media_pleyer.Volume_control1.value = valoriDivisi(1)
                lb_volume.Text = valoriDivisi(1) + "%"
                Volume_control1.value = valoriDivisi(1)
                media_pleyer.Timer3.Start()
                media_pleyer.AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
                AxWindowsMediaPlayer1.settings.volume = media_pleyer.Volume_control1.value
                video.Wmp1.settings.voume = video.Volume_control1.value
            End If
        End If
    End If

    ' possibili usi degli errori ritornati se ometti li ignori
    If valoriDivisi(0) = "N" Then
        ' Il dato è riferito a nessun valore ricevuto
        lblgradi.Text = valoriDivisi(1) ' l'info su lblgradi, oppure dove vuoi
    End If

    If valoriDivisi(0) = "E" Then
        ' Il dato è riferito a errore sulla seriale
        lblgradi.Text = valoriDivisi(1) ' il tipo d'errore su lblgradi, oppure dove vuoi
    End If

    Label1.Text = "NORD"
End Sub


Questo deve migliorare la situazione, non dovresti più avere errori.

Per il discorso codice arduino te l'ho modificato per provarlo l'ho postato alle 9:57 di Sabato 23/03/2024.
Prima provalo e controlla i valori che vedi in textBox1, fammi sapere.
Ultima modifica effettuata da Carlo 26/03 17:26
in programmazione tutto è permesso
26/03 17:10
nightwolf
Ok, grazie. Proverò certamente e vi farò sapere.
aaa