Go Down

Topic: Monitor porta Com con VisualBasic 2008 e Arduino... (Read 1 time) previous topic - next topic

dukone

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...
chi si accontenta gode.... ma chi gode non si accontenta mai...


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

niki77

#1
Nov 13, 2012, 12:48 pm Last Edit: Nov 13, 2012, 12:50 pm by niki77 Reason: 1


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?
Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

dukone

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

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


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


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

niki77

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


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

dukone

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
chi si accontenta gode.... ma chi gode non si accontenta mai...


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

niki77

#5
Nov 13, 2012, 03:11 pm Last Edit: Nov 13, 2012, 03:19 pm by niki77 Reason: 1
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: [Select]


   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: [Select]


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: [Select]

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


che dovrai modificare necessariamente in

Code: [Select]

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


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

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

dukone

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à...
chi si accontenta gode.... ma chi gode non si accontenta mai...


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

niki77

#7
Nov 13, 2012, 05:03 pm Last Edit: Nov 13, 2012, 05:06 pm by niki77 Reason: 1
Visto che devi imparare perchè non parti direttamente da C# ? (è anche più pratico per il copia incolla  :smiley-yell:)

Code: [Select]


   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: [Select]


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.




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

dukone

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

Quote
SerialPort1.NewLine = vbCrLf


Come dicevi tu non mi funzionava.
chi si accontenta gode.... ma chi gode non si accontenta mai...


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

niki77

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 ...  ;)

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

cyberhs

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

niki77

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

Go Up