Arduino Forum

International => Italiano => Software => Topic started by: Barto91 on Mar 06, 2017, 11:51 am

Title: Problema con comunicazione seriale
Post by: Barto91 on Mar 06, 2017, 11:51 am
Buongiorno a tutti,
ho necessità di trasmettere in seriale alla scheda Arduino (trasmesso tramite un software Visual Basic .NET) un numero intero di 2 cifre per poi elaborarlo cifra per cifra. Il mio problema è che non riesco a convertire in modo adeguato il valore letto dalla seriale per poi confrontarli con altri numeri definiti come interi. Dal Visual Basic sicuramente invio in sequenza 2 numeri interi che corrispondono alle decine e alle unità del numero in esame.
Posto il mio codice:
Code: [Select]

int numero[2];
int intervallo = 2000;
int tempoUP = 1000;
int i;
int j;

void setup()
{
  Serial.begin(9600);
  for(i=2;i<=11;i++)
  {
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW); 
  }
}

void loop()
{
  if(Serial.available())
  {
    numero[0]=Serial.read(); 
    numero[1]=Serial.read(); 
    for(j=0;j<=1;j++)
    {
      for(i=0;i<=9;i++)
      {
        if (numero[j] == i)
        {
          digitalWrite(i, HIGH);
          delay(tempoUP);
          digitalWrite(i, LOW);
          delay(intervallo);
        }
      }
    }   
  }
}



Qualcuno può darmi qualche dritta su come posso utilizzare il vettore int numero[ ] confrontando i suoi elementi con variabili intere???
Essenzialmente il problema è che riesco a compilare correttamente tutto il codice, ma quando entro in questi cicli:
Code: [Select]

 for(j=0;j<=1;j++)
    {
      for(i=0;i<=9;i++)
      {
        if (numero[j] == i)
        {
          digitalWrite(i, HIGH);
          delay(tempoUP);
          digitalWrite(i, LOW);
          delay(intervallo);
        }
      }
    }   

non avviene il confronto e quindi non ottengo le uscite desiderate (anzi, non ottengo proprio uscite).
Grazie a tutti!
Title: Re: Problema con comunicazione seriale
Post by: gpb01 on Mar 06, 2017, 11:56 am
Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ... Grazie.

Guglielmo
Title: Re: Problema con comunicazione seriale
Post by: Barto91 on Mar 06, 2017, 12:09 pm
Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (http://forum.arduino.cc/index.php?topic=113640.0) (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO (http://forum.arduino.cc/index.php?topic=149082.0) ... Grazie.

Guglielmo
Fatto! Grazie 1000, scusa la mia mancanza!
Title: Re: Problema con comunicazione seriale
Post by: gpb01 on Mar 06, 2017, 01:27 pm
Molto probabilmmnete quando tu spedisci il numero da VB il numero viene trasmesso in ASCII e quindi tu non ricevi il numero, ma la sua rappresentazione ASCII.

Mi spiego, immagina di trasmettere il numero di due cifre decimali 10 .. le due cifre vengono codificate in ASCII e trasmesse come 0x31 0x30 e sono questi valori che tu ricevi.

Prova a stampare in HEX quanto ricevi e guarda cosa veramente ti arriva ...

Guglielmo
Title: Re: Problema con comunicazione seriale
Post by: Barto91 on Mar 07, 2017, 09:06 am
Molto probabilmmnete quando tu spedisci il numero da VB il numero viene trasmesso in ASCII e quindi tu non ricevi il numero, ma la sua rappresentazione ASCII.

Mi spiego, immagina di trasmettere il numero di due cifre decimali 10 .. le due cifre vengono codificate in ASCII e trasmesse come 0x31 0x30 e sono questi valori che tu ricevi.

Prova a stampare in HEX quanto ricevi e guarda cosa veramente ti arriva ...

Guglielmo
Purtroppo non riesco ad aprire il plotter o il serial monitor poichè ho la porta già occupata dal VB.
Ho provato a fare convertire il l'indice i dentro il confronto if nel seguente modo:
Code: [Select]

 if (numero[j] == String(i,BIN))
        {
          digitalWrite(i, HIGH);
          delay(tempoUP);
          digitalWrite(i, LOW);
          delay(intervallo);
        }

e così facendo "qualcosa si muove", cioè mi si alza sempre il pin 2 solo una volta indifferentemente da quale sia il numero in ingresso.
Secondo il mio modesto parere i problemi sono nelle conversioni, poichè se utilizzo il seguente codice il programma funziona benissimo:

Code: [Select]

int numero1;
int numero2;
int inter = 500;
int tempoUP = 200;
int i;

void setup()
{
  Serial.begin(9600);
  for(i=2;i<=11;i++)
  {
    pinMode(i, OUTPUT);
    digitalWrite(i,LOW); 
  }
}

void loop()
{
  int i;
  int j=0;
  if(Serial.available())
  {
    numero1=Serial.read(); 
    numero2=Serial.read(); 
    if (numero1 =='0')
    {
      digitalWrite(2, HIGH);
      delay(tempoUP);
      digitalWrite(2, LOW);
    }
    if (numero1=='1')
    {
      digitalWrite(3, HIGH);
      delay(tempoUP);
      digitalWrite(3, LOW);
    }
    if (numero1=='2')
    {
      digitalWrite(4, HIGH);
      delay(tempoUP);
      digitalWrite(4, LOW);
    }
    if (numero1=='3')
    {
      digitalWrite(5, HIGH);
      delay(tempoUP);
      digitalWrite(5, LOW);
    }
    if (numero1=='4')
    {
      digitalWrite(6, HIGH);
      delay(tempoUP);
      digitalWrite(6, LOW);
    }
    if (numero1=='5')
    {
      digitalWrite(7, HIGH);
      delay(tempoUP);
      digitalWrite(7, LOW);
    }
    if (numero1=='6')
    {
      digitalWrite(8, HIGH);
      delay(tempoUP);
      digitalWrite(8, LOW);
    }
    if (numero1=='7')
    {
      digitalWrite(9, HIGH);
      delay(tempoUP);
      digitalWrite(9, LOW);
    }
    if (numero1=='8')
    {
      digitalWrite(10, HIGH);
      delay(tempoUP);
      digitalWrite(10, LOW);
    }
    if (numero1=='9')
    {
      digitalWrite(11, HIGH);
      delay(tempoUP);
      digitalWrite(11, LOW);
    }
    delay(inter);
    if (numero2=='0')
    {
      digitalWrite(2, HIGH);
      delay(tempoUP);
      digitalWrite(2, LOW);
    }
    if (numero2=='1')
    {
      digitalWrite(3, HIGH);
      delay(tempoUP);
      digitalWrite(3, LOW);
    }
    if (numero2=='2')
    {
      digitalWrite(4, HIGH);
      delay(tempoUP);
      digitalWrite(4, LOW);
    }
    if (numero2=='3')
    {
      digitalWrite(5, HIGH);
      delay(tempoUP);
      digitalWrite(5, LOW);
    }
    if (numero2=='4')
    {
      digitalWrite(6, HIGH);
      delay(tempoUP);
      digitalWrite(6, LOW);
    }
    if (numero2=='5')
    {
      digitalWrite(7, HIGH);
      delay(tempoUP);
      digitalWrite(7, LOW);
    }
    if (numero2=='6')
    {
      digitalWrite(8, HIGH);
      delay(tempoUP);
      digitalWrite(8, LOW);
    }
    if (numero2=='7')
    {
      digitalWrite(9, HIGH);
      delay(tempoUP);
      digitalWrite(9, LOW);
    }
    if (numero2=='8')
    {
      digitalWrite(10, HIGH);
      delay(tempoUP);
      digitalWrite(10, LOW);
    }
    if (numero2=='9')
    {
      digitalWrite(11, HIGH);       
      delay(tempoUP);
      digitalWrite(11, LOW);
    }
  }
}




però credo che tu convenga con me che questo codice è lungo, ripetitivo e non iterativo.
Grazie
Title: Re: Problema con comunicazione seriale
Post by: brunello22 on Mar 07, 2017, 09:38 am
Ma se ti riconosce questo
Code: [Select]
if (numero1 =='0')

vuol dire che gli invii uno '0', codice ascii 0x30 decimale 48
quindi

Code: [Select]

 for(j=0;j<=1;j++)
    {
      for(i=0;i<=9;i++)
      {
        if (numero[j] == i+48 )
        {
          digitalWrite(i+2, HIGH);
          delay(tempoUP);
          digitalWrite(i+2, LOW);
          delay(intervallo);
        }
      }
    }  


Aretino, di dove ?
Title: Re: Problema con comunicazione seriale
Post by: Barto91 on Mar 07, 2017, 10:24 am
Ma se ti riconosce questo
Code: [Select]
if (numero1 =='0')

vuol dire che gli invii uno '0', codice ascii 0x30 decimale 48
quindi

Code: [Select]

 for(j=0;j<=1;j++)
    {
      for(i=0;i<=9;i++)
      {
        if (numero[j] == i+48 )
        {
          digitalWrite(i+2, HIGH);
          delay(tempoUP);
          digitalWrite(i+2, LOW);
          delay(intervallo);
        }
      }
    }   


Aretino, di dove ?

F U N Z I O N A!!!!!!!!!!!! Grazie 1000!!!!!

Sono del Valdarno, Loro Ciuffenna
Title: Re: Problema con comunicazione seriale
Post by: brunello22 on Mar 07, 2017, 10:26 am
Quasi compaesano, Montevarchi
Title: Re: Problema con comunicazione seriale
Post by: Barto91 on Mar 08, 2017, 09:11 am
Quasi compaesano, Montevarchi
Davvero!!! Com'è piccolo il mondo!
Grazie ancora! A presto!
Title: Re: Problema con comunicazione seriale
Post by: claudio_f on Mar 08, 2017, 05:32 pm
Quote from: Barto91
F U N Z I O N A!!!!!!!!!!!! Grazie 1000!!!!!
Mi sembra un tantinello complicata come soluzione  ;)
Code: [Select]
digitalWrite(numero[0] - 46, HIGH);
delay(tempoUP);
digitalWrite(numero[0] - 46, LOW);
delay(intervallo);
digitalWrite(numero[1] - 46, HIGH);
delay(tempoUP);
digitalWrite(numero[1] - 46, LOW);