aiuto programmazione

ciao sono nuovo e ho appena cominciato a far interagire vb 6.0 con Arduino . quello che sto cercando di fare è accendere il led 13 con un pulsante e di spegnerlo con l' altro. ecco il codice : Arduino :

int segn1 = 13; void setup () { Serial.begin (9600); pinMode (segn1, OUTPUT); Serial.flush(); } void loop () { if (Serial.available ()) { if (Serial.read() == 'a') { digitalWrite (segn1, HIGH); Serial.flush(); } if (Serial.read() == '5') { digitalWrite (segn1, LOW); Serial.flush(); } } }

vb:

Dim segn1 As String Private Sub Command1_Click() segn1 = "a" MSComm1.Output = "a" End Sub

Private Sub Command2_Click() segn1 = "5" MSComm1.Output = "5" End Sub

Private Sub Form_Load() MSComm1.CommPort = 3 MSComm1.Settings = "9600,n,8,1" On Error Resume Next MSComm1.PortOpen = True If Err Then MsgBox "Errore nella apertura della COM" & MSComm1.CommPort End If On Error GoTo 0 End Sub

Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False End Sub

il problema è che non si spegne però si accende aiuto grazie

if (Serial.available ()) {
if (Serial.read() == 'a')
{
  digitalWrite (segn1, HIGH);
  Serial.flush();
}
if (Serial.read() == '5')
{
  digitalWrite (segn1, LOW);
  Serial.flush();
}
}

Stai facendo un errore di concetto. I sintomi sono conformi con quello che fa il codice.

Il primo "if (Serial.available ()) {" aspetta finche viene un carattere dalla seriale.

Il secondo "if (Serial.read() == 'a')" legge (scarica) il primo carattere che é stato trasferito sulla seriale.

Il terzo "if (Serial.read() == '5')" legge il secondo carattere dalla seriale che non é piú quello che hai spedito per primo.

Il "5" si blocca al secondo if e non arriva mai al terzo if.

Soluzione. Devi memorizzare il carattere che viene dalla seriale e controllare il contenzto di quella variabile nei if:

if (Serial.available ()) {
datoricevuto = Serial.read();
if (datoricevuto == 'a')
{
  digitalWrite (segn1, HIGH);
  Serial.flush();
}
if (datoricevuto == '5')
{
  digitalWrite (segn1, LOW);
  Serial.flush();
}
}

Ciao Uwe

grazie mille e che non conoscevo tanto bene come ragiona l' Arduino con il seriale grazie .

http://arduino.cc/en/Serial/Peek

Usando Serial.peek puoi "vedere" (senza scaricare) il prossimo byte sulla seriale, anche più di una volta. In questo modo puoi usare un if..else senza usare una variabile per memorizzare il dato:

if (Serial.available ()) {
  if (Serial.peek() == 'a') {
    digitalWrite (segn1, HIGH);
  } else if (Serial.peek() == '5') {
    digitalWrite (segn1, LOW);
  }
  Serial.flush(); //svuota prima di rimettersi in ascolto - così lo scrivi solo 1 volta
}

Come vedi, di modi per fare la stessa cosa ce ne sono tanti, dipende dalla logica che si vuole seguire.

Anche un switch case va bene:

if (Serial.available ()) {
switch (Serial.read()) {
    case "a":
       digitalWrite (segn1, HIGH);
      break;
    case "5":
       digitalWrite (segn1, LOW);
      break;
}
Serial.flush(); 
}

Ciao Uwe

Ehm... lo switch..case funziona solo con i numeri ;) Per far sì che vada, bisogna sostituire i controlli che hai messo con i doppi apici con gli apici singoli. Quindi case "a" -> [u]case 'a'[/u] in modo che il carattere sia trattato come char e non come stringa.