Pages: [1]   Go Down
Author Topic: Monitor porta Com con VisualBasic 2008 e Arduino...  (Read 944 times)
0 Members and 1 Guest are viewing this topic.
CT
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Su arduino il codice è questo...
Quote
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...
Logged

chi si accontenta gode.... ma chi gode non si accontenta mai...


"...il mio crimine è la curiosità... puoi fermarne uno, non puoi fermarli

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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?
« Last Edit: November 13, 2012, 06:50:38 am by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

CT
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho usato  Rxdata = SerialPort1.ReadLine ora uso   smiley-wink 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...

Quote
   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

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

Logged

chi si accontenta gode.... ma chi gode non si accontenta mai...


"...il mio crimine è la curiosità... puoi fermarne uno, non puoi fermarli

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se magari mi scrivi lo stack dell'eccezione... sennò ... mica sono frate indovino!  smiley-mr-green


Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

CT
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

eccoti il tutto....  smiley-sweat
Quote
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
Logged

chi si accontenta gode.... ma chi gode non si accontenta mai...


"...il mio crimine è la curiosità... puoi fermarne uno, non puoi fermarli

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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,

Code:

    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.

Code:

 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

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

che dovrai modificare necessariamente in

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

Su una cosa hai ragione, ti mancava solo di sistemare una cosetta  smiley-mr-green smiley-mr-green

« Last Edit: November 13, 2012, 09:19:56 am by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

CT
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusami se ne approfitto...

Quote
    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'è?
Quote
stack dell'eccezione o stack trace
scusa se ne approfitto vorrei imparare e non copiare e incollare..
cmq grazie della tua disponibilità...
Logged

chi si accontenta gode.... ma chi gode non si accontenta mai...


"...il mio crimine è la curiosità... puoi fermarne uno, non puoi fermarli

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:

    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 :

Code:

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.




« Last Edit: November 13, 2012, 11:06:07 am by niki77 » Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

CT
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
SerialPort1.NewLine = vbCrLf

Come dicevi tu non mi funzionava.
Logged

chi si accontenta gode.... ma chi gode non si accontenta mai...


"...il mio crimine è la curiosità... puoi fermarne uno, non puoi fermarli

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Edit. ho confermato la mia insicurezza  smiley-mr-green

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 ...  smiley-wink

Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 44
Posts: 1384
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Il Serial.println, come dice il manuale di Arduino, restituisce sempre una stringa terminata da <CR> e <LF>.
Logged

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora se è così va benissimo vbCrLf  smiley-wink
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Pages: [1]   Go Up
Jump to: