
bernie (Normal User)
Pro
    
Messaggi: 158
Iscritto: 23/10/2019
|
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
Codice sorgente - presumibilmente VB.NET |
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
Codice sorgente - presumibilmente VB.NET |
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
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2252
Iscritto: 04/05/2008
|
In parte dipende dalla variabile usata in Arduino.
Al posto di int usa long.
Prova così e facci sapere.
|
|

bernie (Normal User)
Pro
    
Messaggi: 158
Iscritto: 23/10/2019
|
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
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2252
Iscritto: 04/05/2008
|
No infatti non dovrebbe segnarti nessun errore.
Però, leggendo bene,
Se il valore inviato da arduino è: 10256
Codice sorgente - presumibilmente C# / VB.NET |
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.
Codice sorgente - presumibilmente VB.NET |
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 il 09/05/2022 alle 9:50
|
|

bernie (Normal User)
Pro
    
Messaggi: 158
Iscritto: 23/10/2019
|
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
|
|

bernie (Normal User)
Pro
    
Messaggi: 158
Iscritto: 23/10/2019
|
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
|
|

bernie (Normal User)
Pro
    
Messaggi: 158
Iscritto: 23/10/2019
|
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
|
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6336
Iscritto: 03/01/2010
|
Usa un timer
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|

bernie (Normal User)
Pro
    
Messaggi: 158
Iscritto: 23/10/2019
|
Buongiorno nessuno Il timer lo uso già nell'arduino per mandare i vari dati ogni tot secondi. Se uso un timer anche lato VB non corro il rischio che i due timer non siano sincronizzati e mi perdo dei dati? Per capirci, la parte VB sarebbe solo l'interfaccia, serve solo per mostrare quello che sta facendo Arduino. Io avevo pensato a due possibilità: 1) lasciare sempre la parte VB in ascolto sulla seriale e quando iniziano ad arrivare i dati elaborarli e metterli nelle varie textbox. Questa non ho capito come realizzarla 2) lasciare Arduino sempre in ascolto , da VB mandare un tris sulla seriale e a quel punto Arduino mi rimanda i vari dati. Questa soluzione mi piace poco perché vorrei tenere Arduino il più libero possibile per quello che deve realmente fare. Nel caso ci siano altre possibilità, se qualcuno me le spiega ne sarei felice. Buona giornata.
|
|