ciao
vorrei trasmette un dato da arduino ad un programma scritto in VB(visual basic 2010 express)
il programma elementare scritto in arduino è:
int link1 =12;
int stato;
int led = 13;
int led2 = 10;
void setup(){
Serial.begin(9600);
pinMode(link1, INPUT);
pinMode(led, OUTPUT);
pinMode(led2, OUTPUT);
}
void loop (){
stato = digitalRead(link1);
if(stato == HIGH ){
Serial.println("verde");
digitalWrite(led, HIGH);
digitalWrite(led2, LOW);
}else if(stato == LOW){
digitalWrite(led2, HIGH);
digitalWrite(led, LOW);
Serial.println("rosso");
}
}
quando arduino non è collegato al pc , funziona! i led si accendono secondo quanto previsto dal codice, e osservando il monitor seriale viene trasmessa la stringa "rosso" o la stringa "verde" .
quando però collego arduino al PC e lancio il programma in VB , NON c'è comunicazione tra ardueino e VB e nel monitor seriale appare la scritta riportata in oggetto!!
cosa sbaglio?? perchè la porta è occupata??
nel fare una prova opposta a questa e cioè trasmettere un comando da VB ad arduino por fare accendere o spegnere un Led , tutto funziona ! la porta(la stessa porta ) permette la comunicazione!!
per meglio far capire il problema a chi potrà darmi un aiuto , inserisco anche il codice scritto in VB ( che ancora non so se funziona non avendo ancora un collegamento fra i due dispositivi)
Public Class Form1
Dim valoreArduino As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CmbPorta.DataSource = System.IO.Ports.SerialPort.GetPortNames
SerialPort1.Close()
SerialPort1.PortName = CmbPorta.Text
'SerialPort1.PortName = "COM3"
SerialPort1.Open()
End Sub
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
If valoreArduino = "verde" Then
WebBrowser1.Navigate(TextBox1.Text)
ElseIf valoreArduino = "rosso" Then
WebBrowser1.Navigate(TextBox2.Text)
End If
End Sub
Private Sub SerialPort1_DataReceived(sender As Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
valoreArduino = SerialPort1.ReadLine
End Sub
End Class
quando arduino non è collegato al pc , funziona! i led si accendono secondo quanto previsto dal codice, e osservando il monitor seriale viene trasmessa la stringa "rosso" o la stringa "verde" .
Sembra che invecchio troppo velocemente e non capisco piú tutte le cose.
Come fai a non collegare Arduino al PC e leggere nel monitor seriale delle scritte?
Forse in un forum di VB ricevi risposte piú mirate sul VB che qua.
Ciao! Nel codice vb readline è senza parentesi e ci vogliono.
Serialport.getportnames restituisce un array e non una stringa, mettere ciò che restituisce in un array e prendere il primo elemento da assegnare a name.
Senza contare che nel codici poi gli assegni com3, quindi cercherà di leggere solo dalla porta com3.
In pratica stai usando male getportnames che restituisce un array di stringhe e devi prendere il primo elemento, poi specifici la porta com3 e sarà sempre quella ad essere utilizzata.
uwefed:
Sembra che invecchio troppo velocemente e non capisco piú tutte le cose.
Come fai a non collegare Arduino al PC e leggere nel monitor seriale delle scritte?
non stai invecchiando tranquillo!! ho semplicemente scritto una cazzata io...
volevo dire che attraverso il monitor seriale vedo inviare la stringa quando il programmino in VB non è aperto e non quando arduino è scollegato dl PC...
lanciando il programmino VB sul monitor seriale esce la scritta di errore come in oggetto.
non usando il monitor seriale (per seguire il suggerimento di Federico66 e DocDoc) arduino continua a non comunicare con VB , probabilmente perche la COM utilizzata risulta sempre chiusa anche se non è usata da nessun monitor seriale.
torn24:
Ciao! Nel codice vb readline è senza parentesi e ci vogliono.[/b]
se ti riferisci al readline in terzultima riga, credo che le parentesi non vadano bene perché ho provato a metterle e mi da errore!
Serialport.getportnames restituisce un array e non una stringa, mettere ciò che restituisce in un array e prendere il primo elemento da assegnare a name.
come si fa? a mettere ciò che restituisce in un array o fare in modo che non mi restituisca un array ma una stringa? cosa dovrei usare al posto di "Serialport.getportnames "
Senza contare che nel codici poi gli assegni com3, quindi cercherà di leggere solo dalla porta com3.
la scritta : SerialPort1.PortName = "COM3" ha un ' che dovrebbe rendere inattivo il comando, giusto? (chiedo conferma, perchè è la prima volta che faccio una cosa del genere e nn conosco VB, sto imparando ora...)
In pratica stai usando male getportnames che restituisce un array di stringhe e devi prendere il primo elemento, poi specifici la porta com3 e sarà sempre quella ad essere utilizzata.[/b]
Fai le cose a poco a poco, inizia individuando la porta seriale usata dal serial monitor ed imposta quella sul programma VB.
L'elenco di tutte le porte esistenti non ti fa sapere con certezza su quale porta COMx sia collegata la tua scheda, successivamente adopererai la tecnica di metterle in un elenco e selezionare la porta come nell'esempio che ti è stato indicato.
Quando avrai preso pratica, poi imlementerai un autoriconoscimento.
Veniamo alla parte meno OT della richiesta, c'è un'altra cosa che non va.
Inviare una valanga di dati sulla linea seriale non è mai una buona idea.
Specialmente se lato VB usi l'evento ricezione seriale, sarebbe meglio inviare "rosso" o "verde" (poi sistemerai anche questo aspetto, intanto invia pure "rosso" e "verde") solo quando c'è un cambiamento di stato, è inutile inviare sequenze di dati tutti uguali.
Creati una variabile statoprecedente e confronta lo stato attuale che ti deriva dal digitalread con lo stato precedente, se sono diversi allora invia il dato. Mentre ci siamo: derivando da digitalread, stato e statoprecedente mettili come boolean invece che come int.
Mentre ci siamo bis: se fai un if su una variabile booleana che quindi può essere solo true o false, puoi mettere semplicemente un else invece di un elseif tanto se non è true è false, non può essere altro!
Il problema è lato PC e VB.net, il programma lato arduino pur semplice è corretto
Penso che normalmente collegando arduino al PC stiamo usando una sola porta seriale, ossia se non abbiamo altri dispositivi che usano la seriale, dovrebbe essere in uso una sola porta. Da cui prendere il primo elemento del System.IO.Ports.SerialPort.GetPortNames.
Ti mancano nozioni di vb.net, io conoscevo un po vb6 ma col net mi sono dedicato a C sharp. Google può risolvere i singoli problemi
ricerca
1)Dichiarare un array in vb.net
2)Usare metodi in vb.net
piero54:
non usando il monitor seriale (per seguire il suggerimento di Federico66 e DocDoc) arduino continua a non comunicare con VB , probabilmente perche la COM utilizzata risulta sempre chiusa anche se non è usata da nessun monitor seriale.
Chiariamo, una porta seriale è "chiusa" quando non è "aperta" da qualche programma, ma questo non significa che da VB non puoi aprire una porta "chiusa".
Probabilmente non indirizzi la porta giusta. Metti a parametro del tuo programma (o in configurazione tra i Settings) il nome della porta da utilizzare e che imposti nella property "PortName" del controllo seriale. Per sapere quale, vedi nell'IDE quale COMx usi per programmare Arduino.
Ovviamente devi impostare correttamente anche gli altri parametri seriali come velocità, bit dati, handshake eccetera, ad esempio:
SerialPort1.PortName = My.Settings.PortName ' la porta COM
SerialPort1.BaudRate = 9600 ' (la velocità che hai messo nello sketch come Serial.begin)
SerialPort1.DataBits = 8
SerialPort1.Parity = Parity.None
SerialPort1.StopBits = StopBits.One
SerialPort1.Handshake = Handshake.None
Quindi chiudi l'IDE ed il Monitor Seriale se aperti, e lancia il programma VB.