gestione porta seriale

ho un dubbio:
ho un applicazione visualbasic che ad un certo punto del suo funzionamento gli faccio scrivere una stringa sulla porta seriale, quindi questa stringa dovrebbe attivare un allarme gestito da arduino, premetto che pero l'applicazione in questione in sostanza è un timer . Il problema che non riesco a superare è questo:
trattandosi di un timer io con visual basic faccio arrivare la stringa a visual basic con un timer quindi questa non è fissa ma cambia con cadenza pari all'intervallo del timer, percio visual basi riceve sempre la stringa aggiornata. Posso in qualche modo "memorizzare" questa stringa la prima volta che la ricevo e poi gestire il tutto in arduino? Perche adesso mi trovo che l'allarme parte ma poi la routine di arduino riparte da capo perche la porta seriale rdi arduino riceve un altro valore.

Dacci qualche esempio della stringa trasmesa.
Ciao Uwe

nikola291:
adesso mi trovo che l'allarme parte ma poi la routine di arduino riparte da capo perche la porta seriale rdi arduino riceve un altro valore.

Riceve un altro valore? E chi glielo spedisce?
La "routine di Arduino riparte da capo" non sta forse a significare che la scheda si resetta? La seriale tra Arduino e PC è mantenuta aperta tutto il tempo oppure il tuo programma in VB la apre e la chiude? In questo caso, ogni volta che apri la seriale l'Arduino viene resettato, lo sai?

Se proprio hai necessità di fare Open e Close della porta, puoi disabilitare il DTR dalla porta virtuale
porta.DTREnable=False
se ben ricordo questo dovrebbe evitarti il reset.

scusate la confuzione ma sicuramente mi sono espresso male faccio un esempio con un codice per rendere meglio l'idea

visual basic
nel load del form ho inserito

 SerialPort1.Close()
        SerialPort1.PortName = "COM13"
        SerialPort1.Open()
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
if labeldiprova.visible=True then Serialport1.write(1)
end sub

quindi visual basic soddisfatta la condizione scrive sulla porta seriale
in arduino
se scrivo

x=Serial.read()
if (x=1)
{

digitalWrite(2,HIGH);
delay(1000);
digitalWrite(2,LOW);
delay(1000);
}

edit by mod: per favore includi il codice usando gli appositi tag

il led si spegne e si accende per 1 secondo ma la routine poi si ferma e riparte solo se io clikko su visual basic il bottone,
io vorre che la routine continuasse fino a che il valore non cambia, cioe come se una volta che visual basic manda il valore ad arduino questo lo deve gestire fin a quando non cambia

questo è quello che intendevo

Normale, esegue e finisce li ... devi quindi crearti un ciclo ripetitivo, cosa che puoi fare in vari modi ...

  1. Racchiudere la logica nel ciclo loop() di Arduino

  2. Utilizzare istruzioni tipo "while"

ecc.

Naturalmente, in ogni ciclo, dovrai leggere la seriale, vedere se arriva qualche cosa e se il qualche cosa è il comando di cambiare stato del led :wink:

Guglielmo

Nel tuo programma per Arduino c'è un errore.

if (x=1)

Questa è un'assegnazione, non un confronto.
In C/C++ non è come in VB, se vuoi fare un contronto devi usare i doppi segni uguali:

if (x==1)

nikola291:
io vorre che la routine continuasse fino a che il valore non cambia, cioe come se una volta che visual basic manda il valore ad arduino questo lo deve gestire fin a quando non cambia

x=Serial.read();
if (x==1)
{ if(statoLED==FALSE)
    statoLED=TRUE;
  else
    statoLED=FALSE;
}
if(statoLED==TRUE)
{ digitalWrite(2,HIGH);
  delay(1000);
  digitalWrite(2,LOW);
  delay(1000);
}

Tra le variabili globali dichiari la statoLED

boolean statoLED=FALSE;

Il mandare da VB il valore 1 diventa il premere un interruttore.

Eventualmente puoi accendere mandando 1 e spegnere mandando 2, perciò in Arduino:

if (x==1)
{ statoLED=TRUE;
}
if(x==2)
{ statoLED=FALSE;
}

gpb01:
Normale, esegue e finisce li ... devi quindi crearti un ciclo ripetitivo, cosa che puoi fare in vari modi ...

  1. Racchiudere la logica nel ciclo loop() di Arduino

  2. Utilizzare istruzioni tipo "while"

ecc.

Naturalmente, in ogni ciclo, dovrai leggere la seriale, vedere se arriva qualche cosa e se il qualche cosa è il comando di cambiare stato del led :wink:

Guglielmo

bene seguendo questo consiglio ho risolto in parte ovvero si accende il led 1 cioè quando la porta scrive 1
ora a seguire ci sono 5 led
quindi in visual basic ho impostato quando si verifica una condizione scrivi 2 poi 3 e cosi via........
mentre in Arduino ho scritto quando ricevi 1 accendi 1, quando ricevi due accendi 1 e 2, quando ricevi 3 accendi 1,2 e 3 .....ecc ecc

ma alla fine il risultato che ottengo è che si accende solo il led 1 e basta, premetto che i collegamenti sono a posto ho testato ogni led che si accendesse

codice visual basic

   If MASHOK1.Visible = True Then x = "1"
        If x = "1" Then SerialPort1.Write("1")
        If MASHOK2.Visible = True Then x = "2"
        If x = "2" Then SerialPort1.Write("2")
        If MASHOK2.Visible = True Then x = "2"
        If x = "2" Then SerialPort1.Write("2")
        If MASHOK3.Visible = True Then x = "3"
        If x = "3" Then SerialPort1.Write("3")
        If MASHOK4.Visible = True Then x = "4"
        If x = "4" Then SerialPort1.Write("4")
        If MASHOK5.Visible = True Then x = "5"
        If x = "5" Then SerialPort1.Write("5")

codice Arduino

  while  (statomash=='2')
  {
    digitalWrite(mashok1,LOW);
    digitalWrite(mashok2,HIGH);

  }   
 statomash=Serial.read();  
  while (statomash=='3')
  {
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);

  }
   statomash=Serial.read();
  while (statomash=='4')
  {
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    digitalWrite(mashok4,HIGH);

  }   
   statomash=Serial.read();
  while (statomash=='5')
  {
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    digitalWrite(mashok4,HIGH);
    digitalWrite(mashok5,HIGH);

  }     
}

edit by mod: per favore includi il codice usando gli appositi tag code - 2° avviso

ps ovviamente nel voi setup ho impostato i nomi mashok/1/2/3/4/5 ai pin e poi li ho impostati come INPUT

dove sbaglio secondo voi

codice Arduino

  statomash=Serial.read();  
  switch(statomash)
  { case '2':
    digitalWrite(mashok1,LOW);
    digitalWrite(mashok2,HIGH);
     break;
   case '3':
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    break;
   case '4':
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    digitalWrite(mashok4,HIGH);
    break;
   case '5':
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    digitalWrite(mashok4,HIGH);
    digitalWrite(mashok5,HIGH);
    break;
  }

edit by mod: modificato per tag non corretti
sorry @leo non avevo visto i tag errati :blush:

Ora cancello i post dove il codice non è racchiuso fra i tag.... :roll_eyes:

scusate per l'errore non me ne ero accorto......
faro piu attenzione la prossima volta :* :* :* :*

nid69ita:
codice Arduino

  statomash=Serial.read();  

switch(statomash)
  { case '2':
    digitalWrite(mashok1,LOW);
    digitalWrite(mashok2,HIGH);
    break;
  case '3':
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    break;
  case '4':
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    digitalWrite(mashok4,HIGH);
    break;
  case '5':
    digitalWrite(mashok1,HIGH);
    digitalWrite(mashok2,HIGH);
    digitalWrite(mashok3,HIGH);
    digitalWrite(mashok4,HIGH);
    digitalWrite(mashok5,HIGH);
    break;
  }




*edit by mod: modificato per tag non corretti*
sorry @leo non avevo visto i tag errati :blush:

nid69ita:
codice Arduino

  statomash=Serial.read();  

switch(statomash)
 { case '2':
   digitalWrite(mashok1,LOW);
   digitalWrite(mashok2,HIGH);
    break;
  case '3':
   digitalWrite(mashok1,HIGH);
   digitalWrite(mashok2,HIGH);
   digitalWrite(mashok3,HIGH);
   break;
  case '4':
   digitalWrite(mashok1,HIGH);
   digitalWrite(mashok2,HIGH);
   digitalWrite(mashok3,HIGH);
   digitalWrite(mashok4,HIGH);
   break;
  case '5':
   digitalWrite(mashok1,HIGH);
   digitalWrite(mashok2,HIGH);
   digitalWrite(mashok3,HIGH);
   digitalWrite(mashok4,HIGH);
   digitalWrite(mashok5,HIGH);
   break;
 }




*edit by mod: modificato per tag non corretti*
sorry @leo non avevo visto i tag errati :blush:

grazie infinitamente per il tuo preziosissimo aiuto e di quello degl'altri, ora posso proseguire la progettazione.

grazie