Go Down

Topic: Problema con comunicazione seriale (Read 1 time) previous topic - next topic

Barto91

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!

gpb01

Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (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 ... Grazie.

Guglielmo
Search is Your friend ... or I am Your enemy !

Barto91

Buongiorno e benvenuto sul forum,
essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI (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 ... Grazie.

Guglielmo
Fatto! Grazie 1000, scusa la mia mancanza!

gpb01

#3
Mar 06, 2017, 01:27 pm Last Edit: Mar 06, 2017, 01:27 pm by gpb01
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
Search is Your friend ... or I am Your enemy !

Barto91

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

brunello22

#5
Mar 07, 2017, 09:38 am Last Edit: Mar 07, 2017, 09:39 am by Brunello
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 ?

Barto91

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

brunello22


Barto91

Quasi compaesano, Montevarchi
Davvero!!! Com'è piccolo il mondo!
Grazie ancora! A presto!

claudio_f

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

Go Up