Monitor porta Com con VisualBasic 2008 e Arduino...

Buongiorno a tutti, sto scrivendo un'applicazione che legge i comondi da arduino tramite la porta COM...

Su arduino il codice è questo...

int temperatura; void setup () { Serial.begin(9600); } void loop() { temperatura=analogRead(A1); temperatura=(5.0* temperatura *100)/1024; Serial.println(temperatura); Serial.print("Celsius "); delay(1000); }

in visualbasic prendo il tutto e lo assegno a "TextBox1.Text = Rxdata", ma in esecuzione mi mostra questo...

non capisco da il carattere mostrato dopo il 66...

magari a qualcuno è già capitato e mi può dare una mano... se riesco a finirlo posso passarlo magari a qualcuno torna utile...

dukone: non capisco da il carattere mostrato dopo il 66...

é il carattere di LineFeed, se non vuoi visualizzarlo trimmalo. Mi pare che la Serial usi come terminatore 0x10 o 0x13, se verifichi nel debugger cosa transita te ne accorgi subito .

P.S. che metodo hai usato del framework per leggere la seriale? ReadLine o ReadExistings?

ho usato Rxdata = SerialPort1.ReadLine ora uso ;) Rxdata = SerialPort1.ReadLine.Trim Mi manca da risolvere un ultimo problema e ho finito... quando chiudo la porta per stoppare Rxdata mi va tutto in errore...

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Button1.Enabled = True ComboBox1.Enabled = True ComboBox2.Enabled = True SerialPort1.Close() ToolStripStatusLabel1.Text = "Nessuna Porta Connessa " End Sub

e l'errore mi si presenta su Rxdata = SerialPort1.ReadLine.Trim

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Rxdata = SerialPort1.ReadLine.Trim End Sub

Se magari mi scrivi lo stack dell'eccezione... sennò ... mica sono frate indovino! :grin:

eccoti il tutto.... :sweat_smile:

Public Class Form1

Dim Rxdata As String

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Enabled = False Button2.Enabled = False SerialPort1.Close() Dim porte As String() porte = SerialPort1.GetPortNames() For i = 0 To porte.Length - 1 ComboBox1.Items.Add(porte(i)) Next i ComboBox2.Items.Add("9600") ToolStripStatusLabel1.Text = "Nessuna Porta Connessa " Timer1.Enabled = True

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Button1.Enabled = False ComboBox1.Enabled = False ComboBox2.Enabled = False Button2.Enabled = True '....................................................... apri la porta COM SerialPort1.Close() SerialPort1.PortName = ComboBox1.Text SerialPort1.Parity = IO.Ports.Parity.None SerialPort1.DataBits = 8 SerialPort1.StopBits = IO.Ports.StopBits.One SerialPort1.Open() SerialPort1.DiscardInBuffer() '......................................................... ToolStripStatusLabel1.Text = "Porta Connessa " & ComboBox1.Text End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Button1.Enabled = True ComboBox1.Enabled = True ComboBox2.Enabled = True SerialPort1.Close() ToolStripStatusLabel1.Text = "Nessuna Porta Connessa " End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click End End Sub

Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll GroupBox1.Text = "Interval Times " & TrackBar1.Value / 1000 & " seconds" Timer1.Interval = TrackBar1.Value End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Rxdata = SerialPort1.ReadLine.Trim End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick TextBox1.Text = TextBox1.Text & Rxdata & " " End Sub

Private Sub ComboBox2_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox2.SelectedIndexChanged Button1.Enabled = True End Sub End Class

Eh, povero me...

Non ti da un errore, non ti compila proprio!!!!

Non è la stessa cosa, e così come il sorgente del programma (che hai postato) non ha niente a che vedere con lo stack trace che ti avevo chiesto. Poca cosa, almeno ho capito che ti devo dare indicazioni un pò più 'base'.

Dove hai messo Trim hai omesso le parentesi,

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Rxdata = SerialPort1.ReadLine().Trim()
    End Sub

Ma con questo non risolvi comunque il tuo problema perchè Trim rimuove gli spazi bianchi e quello non è uno spazio bianco ma un carattere di A CAPO . Devi innanzitutto capire di che tipo è il carattere di A CAPO che ti manda arduino, una volta capito lo imposti nella proprietà NewLine dell'oggetto SerialPort1.

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        SerialPort1.NewLine =CARATTERE DI FINE RIGA RITORNATO DA ARDUINO
        Button1.Enabled = False
        Button2.Enabled = False
        SerialPort1.Close()
        Dim porte As String()
        porte = SerialPort1.GetPortNames()
        For i = 0 To porte.Length - 1
            ComboBox1.Items.Add(porte(i))
        Next i
        ComboBox2.Items.Add("9600")
        ToolStripStatusLabel1.Text = "Nessuna Porta Connessa "
        Timer1.Enabled = True

    End Sub

Fatto questo non avrai bisogno di trimmare niente perchè SerialPort1.ReadLine() ti ritornerà direttamente il buffer inviato da arduino fino al carattere di A CAPO.

A questo punto però c'è un altra cosa che non va bene, è lo sketch di arduino!! Si perchè tu il carattere di A CAPO lo invii solo dopo il valore numerico

Serial.println(temperatura);
Serial.print("Celsius ");

che dovrai modificare necessariamente in

Serial.print(temperatura);
Serial.println(" Celsius");

Su una cosa hai ragione, ti mancava solo di sistemare una cosetta :grin: :grin:

scusami se ne approfitto…

SerialPort1.NewLine =CARATTERE DI FINE RIGA RITORNATO DA ARDUINO

come trovo CARATTERE DI FINE RIGA RITORNATO DA ARDUINO?

ora vorrei migliorare anche su vb cos’è?

stack dell’eccezione o stack trace

scusa se ne approfitto vorrei imparare e non copiare e incollare…
cmq grazie della tua disponibilità…

Visto che devi imparare perchè non parti direttamente da C# ? (è anche più pratico per il copia incolla :stuck_out_tongue_closed_eyes:)

    SerialPort1.NewLine = Chr(10)

Da notare che il codice scritto sopra potrebbe non funzionare, non posso provarlo perchè ringraziando il cielo almeno VisualBasic ultimamente posso non usarlo più !

potrebbe essere un qualcosa tipo :

SerialPort1.NewLine = DirectCast(Chr(10), String)

Prova mbò…

Per essere quanto più comprensibili possibile si può dire che lo stack trace è l’insieme delle operazioni che ha preceduto l’eccezione (errore).

N.B. questo è una stack di errore di una applicazione Console, se l’appricazione è WinForm appare in una finestra modale.

Poi c’è lo stack di chiamate, che può essere visualizzato non necessariamente a seguito di un errore.

Grazie per i consiglie e la spiegazione... ho risolto cosi:

SerialPort1.NewLine = vbCrLf

Come dicevi tu non mi funzionava.

Non sono affatto sicuro che vbCrLf sia l'equivalente di chr(10).

Edit. ho confermato la mia insicurezza :grin:

vb = visual basic Cr = carriage return Lf = line feed

in sostanza è l'equivalente di chr(13) +chr(10) Ergo cosi facendo con l'istruzione ReadLine SerialPort non ti ritornerà mai nulla. In caso prova a mettere vbLf ... ;)

Il Serial.println, come dice il manuale di Arduino, restituisce sempre una stringa terminata da e .

Allora se è così va benissimo vbCrLf :wink: