Go Down

Topic: Rfid RDM6300 (Read 14418 times) previous topic - next topic

nid69ita

#15
Jan 17, 2014, 02:37 pm Last Edit: Jan 17, 2014, 02:41 pm by nid69ita Reason: 1

Cioè non ho ben capito dovrei fare un ciclo che legge carattere per carattere?

Si, esatto.  
Poi tu dai questo comando:
Code: [Select]
confronto = (String)Serial.read(); ovvero la String confronto è solo 1 carattere, quello ricevuto, non tutta la stringa ricevuta e la confronti con String tag.
Il confronto tra tag e confronto va bene, ma lo puoi fare solo dopo aver ricevuto un tot di caratteri.
Code: [Select]
confronto = confronto +  (char) Serial.read();
Questo mette dentro e "accumula" nella String i vari caratteri
Ma questo non puoi farlo all'infinito!!! E devi mettere dentro solo i valori validi.
my name is IGOR, not AIGOR

pres961

Non riesco a capire il codice come dovrebbe essere? Ho guardato nel reference e parla di un readBytesUntil()

gpb01

Bé ... se vuoi imparare qualche cosa SI, devi leggere carattere a carattere e gestire la cosa, se ne è parlato mille volte sul forum ed è una bella esperienza che ti servirà anche in futuro, se invece vuoi la "pappa fatta" ...

... puoi o usare la readBytes()  oppure usare la  readBytesUntil() ... guardatele e vedi quella che si adatta a cio che tu sai debba arrivarti.

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

pres961

Code: [Select]
String tag= "030030A278E9";
int pinConvalida=8;
int pinNegato=9;
String confronto;
char avanti = 'c';

void setup()
{
  pinMode(pinConvalida,OUTPUT);
  pinMode(pinNegato,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.available())
      for(int i=0; i<13 ;i++){
        confronto = confronto +  (char) Serial.read();
      }
    Serial.println(confronto);
    if(confronto==tag){
      Serial.write("Tag valido");
      digitalWrite(pinNegato,HIGH);
      digitalWrite(pinConvalida,HIGH);
    }
    else{
      if(confronto!=tag){
          Serial.write("Tag non valido");

          digitalWrite(pinConvalida,LOW);
          digitalWrite(pinNegato,HIGH);
     
  }
}
  }
}

Non funziona così :(

gpb01

Naturalmente NO ... in C non puoi mica sommare un char ad un altro ... devi gestire un array di char ...
... t'ho detto, fai un po' di ricerche, se ne è parlato molte volte !!!

Comunque ... necessita un tuo SERIO studio del C credo ... altrimenti non so cosa riuscirai a fare ... ;)

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

gpb01

Scusa, ma quale è la struttura della stringa di caratteri che invia quel lettore ?

Perché vedo che inizia con un STX ... mi meraviglia che non termina con un ETX o con un EOT ... hai la struttura completa di ciò che dovrebbe arrivarti ???

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

pres961

Eh si credo anche io! Io a scuola studio il java che per quanto è simile è molto più libero del C che è davvero molto restrittivo!

pres961

Io sono riuscito a leggere questo 030030A278E9

nid69ita


Naturalmente NO ... in C non puoi mica sommare un char ad un altro ... devi gestire un array di char ...
... t'ho detto, fai un po' di ricerche, se ne è parlato molte volte !!!
Comunque ... necessita un tuo SERIO studio del C credo ... altrimenti non so cosa riuscirai a fare ... ;)
Guglielmo

@Guglielmo, però @pres stà usando variabili String, quindi confronto=confronto+char viene accettato.
@pres, le variabili String sarebbe meglio non usarle perchè sono pesanti per questo tipo di microcontrollore con poca ram.
my name is IGOR, not AIGOR

nid69ita

#24
Jan 17, 2014, 03:08 pm Last Edit: Jan 17, 2014, 03:10 pm by nid69ita Reason: 1

Io sono riuscito a leggere questo 030030A278E9

Quindi l'istruzione Serial.println(confronto); stampa su monitor seriale  030030A278E9 ?
Se si, verifica che non ci sia altro dentro la String.
Stampala cosi:
Code: [Select]
Serial.print(">"); Serial.print(confronto); Serial.println("<");
Ovvero mettici davanti e al fondo due caratteri per essere sicuro che al fondo non ci siano caratteri "invisibili" a video.
my name is IGOR, not AIGOR

pres961

Fare un array di char esattamente come si fa? Scusate ma ho una confusione in testa della madonna. Io so la sintassi del java ma è sbagliata in Arduino. Capitemi è il 4° progetto che faccio in una settimana e tutto per domani che ho l'open day della scuola

gpb01

Orrore ... non avevo visto che usava le String ...

Ok, si, mi sembra che il valore sia quello che ti avevo indicato prima, ma una lettura fatta così NON è corretta ...
... se quel lettore manda STX prima dei dati, il mio sospetto è che mandi anche un ETX e magari anche un CRC per la verifica ...  :smiley-roll:

Come ti ho già chiesto, tu non conosci la "struttura" del pacchetto di caratteri che ti invia quando legge un TAG ???

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

pres961

No quella no l'ho ottenuto con questo sketch
Code: [Select]
void setup()
{
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.available())
    Serial.write(Serial.read());
  }
}

pres961

No la struttura esatta non la conosco! Ho preso solo quel valore letto con lo sketch precedente

gpb01

Cioé ... non hai alcuna documentazione relativa a quel lettore che ti spiega cosa tu debba aspettarti ???  :smiley-eek:

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

Go Up