Oppure

Loading
09/05/22 4:10
bernie
Salve a tutti , come da titolo avrei bisogno di far comunicare arduino con una applicazione in VB.NET.
La parte in VB è solo una interfaccia operatore , dove posso scrivere e leggere dei valori che invio o ricevo da arduino , lui fa tutto il resto.
Arduino trasmette sempre i dati con intervalli di 1 secondo ma li visualizzo solo alla pressione di un pulsante , i dati da VB ad arduino sono tramite pulsante .
Mi ritrovo che a mio parere ad un certo punto dovrei usare la funzione Right , però mi da errore e non ho capito perchè .
Ho provato ad usare anche Rset e Lset , ma anche in questo caso non capisco perchè il risultato non cambia .
Intanto allego quello che ho scritto
Public Class Form1
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        SerialPort1.WriteLine(TextBox2.Text)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SerialPort1.Close()
        ComboBox1.Items.Clear()
        ComboBox1.Items.AddRange(IO.Ports.SerialPort.GetPortNames())
        If ComboBox1.Text <> "" Then
            Try
                SerialPort1.Encoding = System.Text.Encoding.Default
                SerialPort1.PortName = ComboBox1.Text
                SerialPort1.Open()
                MsgBox("connesso")
            Catch ex As Exception
                MsgBox(" non connesso")
            End Try
        End If
    End Sub

    Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click

        Dim arduino As String = SerialPort1.ReadLine()
        Dim lunghezza As Short = Len(arduino)
        Dim valore As String = Right(arduino, lunghezza - 2)
        Dim indice As Short = Mid(arduino, 1, 2)
        If indice = 10 Then
            TextBox2.Text = valore
        End If
        If indice = 20 Then
            TextBox3.Text = valore
        End If
        TextBox4.Text = arduino
    End Sub
End Class

Le prime due cifre del numero che invia arduino , servono per identificare il campo in cui scrivere i valori , le rimanenti cifre son il valore vero e proprio .
Avevo pensato di
1) leggere il valore dalla porta seriale e metterlo in una stringa
2) controllare il numero di caratteri della stringa
3) identificare i primi due caratteri e in base al valore decidere dove scrivere la variabile
4) tagliare dalla stringa le prime due cifre
5) scrivere la stringa tagliata nel campo corretto .
Io sono bloccato al punto 4 .
Se sostituisco Right con LSet o RSet , il programma gira , non da errori , però il valore che mostra non è corretto .
Supponendo che il valore inviato da arduino è 10256 10 indica in che campo devo scrivere 256, usando Lset o Rset mi mostra sempre 1025 .
Ho usato LSet e RSet in questa maniera
Dim valore As String = LSet(arduino, lunghezza - 2)
Dim valore As String = RSet(arduino, lunghezza - 2)

In entrambi i casi il valore che mostra è 1025
Scusate se sono stato prolisso .
Grazie
aaa
09/05/22 6:24
Thejuster
In parte dipende dalla variabile usata in Arduino.
Al posto di int usa long.

Prova così e facci sapere.
mire.forumfree.it/ - Mire Engine
C# UI Designer
09/05/22 6:34
bernie
Ciao Thejuster, in Arduino uso long .
La variabile di Arduino non dovrebbe fare si che mi venga segnato un errore alla riga 26 del programma in VB, almeno credo .
Grazie
aaa
09/05/22 7:38
Thejuster
No infatti non dovrebbe segnarti nessun errore.

Però, leggendo bene,

Se il valore inviato da arduino è: 10256

Dim valore As String = LSet(arduino, lunghezza - 2)


Non so esattamente come funziona LSet o RSet, sinceramente mai usati.
Ma preferisco avere nella testa una sorta di immaginazione che mi indica dove mi sto muovendo utilizzando
SubString, Split e varie manipolazioni delle stringhe.

A questo punto, ti consiglio tramite Debugger di controllare effettivamente la lunghezza della stringa.
Assicurandoti che non ci siano spazi vuoti o da simboli illegibili.

Anche se, personalmente ho sempre utilizzato lo split con un simbolo per queste operazioni.
esempio "10-256" splitto "-" e gestisco i due inidici [0] cella [1] valore.

Tornando al discorso, se non ho capito male, ti servirebbe qualcosa del genere.




    Dim lettura As String = "10256" 'Supponiamo che arduino legge 10256

    lettura = lettura.Trim() 'Elimino eventuali spazi vuoti nella stringa

    Dim cella As String = lettura.Substring(0, 2) 'Recupero le prime due cifre  10  256

    Dim valore As String = lettura.Substring(2, lettura.Length - 2) 'recupero il valore saltando le prime due cifre





Ultima modifica effettuata da Thejuster 09/05/22 7:50
mire.forumfree.it/ - Mire Engine
C# UI Designer
09/05/22 13:19
bernie
Grazie Thejuster, ieri sera non ero arrivato a leggere tutti gli argomenti fino a substring, o forse lo avevo male interpretato.
Questa sera provo e vi faccio sapere.
Grazie e buona giornata.
Bernie
aaa
12/05/22 2:16
bernie
Grazie Thejuster, esattamente quello che mi serviva.
Adesso devo procedere con inviare i dati a Arduino, ma ho già visto qualche cosa che non gira. Devo capire se lato PC o lato Arduini.
Grazie per adesso.
Bernie
aaa
20/05/22 14:07
bernie
Avrei bisogno di alzare l'asticella , Arduino mi trasmette una serie di dati ogni x secondi , come faccio a leggere i dati e scriverli in una textbox senza bisogno di premere il pulsante ?
Arduino scrive 10 numeri ogni 2 secondi , avrei bisogno di visualizzare questi numeri senza bisogno di andare a premere il pulsante .
Cosa devo guardare ?
Grazie
aaa
20/05/22 22:20
Usa un timer