Arduino Forum

International => Italiano => Software => Topic started by: pres961 on Jan 16, 2014, 09:02 pm

Title: Rfid RDM6300
Post by: pres961 on Jan 16, 2014, 09:02 pm
Buona sera ragazzi;
Ho un piccolo problemino in quanto non riesco a trovare l'errore in questo banalissimo sketch:
Code: [Select]

// Serial Library
#include <SoftwareSerial.h>

SoftwareSerial RfidData =  SoftwareSerial(255,2); // Com to Scanner TX's tied together

void setup(){
  Serial.begin(9600);
  RfidData.begin(9600);
}
void loop(){
  Serial.println(RfidData.read());
}

Lo sketch dovrebbe semplicemente stampare su serial monitor il tag letto dalla chiave rfid ma mi stampa solo -1. Come mai?
Title: Re: Rfid RDM6300
Post by: BaBBuino on Jan 16, 2014, 09:19 pm
Innanzitutto non vedo dichiarati i pin hardware della seriale, ma facciamo finta che da qualche parte li hai messi.

Nella dichiarazione di inizializzazione della seriale c'è scritto: SoftwareSerial RfidData =  SoftwareSerial(255,2)

Ora se è vero come è vero che i parametri di SoftwareSerial() sono i due pin fisici di Arduino, mi domando quale tipo di Arduino abbia 255 pin!!
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 16, 2014, 09:27 pm
Code: [Select]

// Serial Library
#include <SoftwareSerial.h>
int rxPin=2;
int txPin=3;
SoftwareSerial RfidData =  SoftwareSerial(rxPin,txPin); // Com to Scanner TX's tied together

void setup(){
  Serial.begin(9600);
  RfidData.begin(9600);
}
void loop(){
  Serial.println(RfidData.read());
}

Diventerebbe così?
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 16, 2014, 09:39 pm
anche correggendo come riportato nel post sopra il codice continua a stamparmi -1!
Title: Re: Rfid RDM6300
Post by: BaBBuino on Jan 16, 2014, 09:59 pm
Mancano dei pezzi!

Prova così:

Code: [Select]

#include <SoftwareSerial.h>

//creo una nuova porta seriale via software
SoftwareSerial RfidData =  SoftwareSerial(2, 3);

void setup()  {
//definisco il pin2(RX) come ingresso
pinMode(2, INPUT);
//definisco il pin3(TX) come uscita
pinMode(3, OUTPUT);
//setto la velocita delle seriali  (software e hardware)
RfidData.begin(9600);
Serial.begin(9600);
}

void loop() {

Serial.println(RfidData.read());
delay(500);
}


E aggiungi un Delay a fine ciclo!
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 16, 2014, 10:16 pm
Così mi stampa dei numeri ma quello che io vorrei ottenere è il tag rfid? Tutto questo mi servirebbe perchè se avvicino la chiave giusta si accende un led verde altrimenti un led rosso e scatta un lampeggiante
Title: Re: Rfid RDM6300
Post by: BaBBuino on Jan 16, 2014, 10:52 pm
Quei numeri sono il TAG dell'RFID!!!

Cosa ti aspettavi? Che uscisse fuori un Signor TAG?  :smiley-roll-blue:
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 11:36 am
No ma non mi aspetto dei numeri casuali che cambiano in continuazione
Title: Re: Rfid RDM6300
Post by: BaBBuino on Jan 17, 2014, 12:07 pm

No ma non mi aspetto dei numeri casuali che cambiano in continuazione


E perchè non l'hai scritto?

Per avere risposte precise dare informazioni precise.

Posta una schermata di questi numeri.
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 01:21 pm
Code: [Select]
-1
-1
-1
2
48
51
48
48
51
48
65
50
55
56
69
57

Questi sono i numeri
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 01:33 pm
Code: [Select]
int tag= "030030A278E9";
int pinConvalida=8;
int pinNegato=9;
int confronto;

void setup()
{
  pinMode(pinConvalida,OUTPUT);
  pinMode(pinNegato,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.available())
    confronto = Serial.read();
    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);
     
  }
}

Sono arrivato a leggere il tag ma ora mi da errore nel codice che ho scritto sopra...
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 01:48 pm
Aggiornamento ho corretto il  codice come segue:
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.read()==avanti)
    confronto = (String)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);
     
  }
}
  }
}

ma purtroppo ora dice sempre tag non valido poichè non riceve nessuna stringa dalla lettura. Come mai?
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 02:19 pm
pres961 ... spero che tu, con lo statement :

Code: [Select]
confronto = Serial.read();

non ti aspetti che venga letto il TAG completo !!!!  :smiley-eek: :smiley-eek: :smiley-eek:

STUDIATEVELI I REFERENCES (http://arduino.cc/en/Serial/Read) !!! Su questo forum sarà stato ripetuto fino alla nausea che la Serial.read() legge UN SINGOLO carattere e che ti devi gestire TU il loop di lettura di tutti i caratteri !!!

Peggio che mai fare il cast che hai fatto nella modifica successiva ... la Serial.read() ritorna UN char e basta !!!

Guglielmo
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 02:26 pm

Code: [Select]
-1
-1
-1
2
48
51
48
48
51
48
65
50
55
56
69
57

Questi sono i numeri


Certo, -1 e -1 erano perché non aspettavi la Serial.available() e, se non c'è nulla, la Serial.read() ritorna -1
2, 48,51,48,48,51,48,65,50,55,56,69,57 altro non sono che i caratteri ricevuti, UNO alla volta, stampati in valore decimale, il cui equivalente ASCII è : STX  0 3 0 0 3 0 A 2 7 8 E 9

Guglielmo

P.S. : STX rappresenta 'Start of Text' (0x02) ed è un codice ASCII di controllo flusso dati
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 02:29 pm
Cioè non ho ben capito dovrei fare un ciclo che legge carattere per carattere?
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 02:37 pm

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.
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 02:46 pm
Non riesco a capire il codice come dovrebbe essere? Ho guardato nel reference e parla di un readBytesUntil()
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 02:56 pm
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() (http://arduino.cc/en/Serial/ReadBytes)  oppure usare la  readBytesUntil() (http://arduino.cc/en/Serial/ReadBytesUntil) ... guardatele e vedi quella che si adatta a cio che tu sai debba arrivarti.

Guglielmo
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 02:58 pm
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ì :(
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:01 pm
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
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:04 pm
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
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:05 pm
Eh si credo anche io! Io a scuola studio il java che per quanto è simile è molto più libero del C che è davvero molto restrittivo!
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:06 pm
Io sono riuscito a leggere questo 030030A278E9
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 03:06 pm

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.
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 03:08 pm

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.
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:10 pm
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
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:10 pm
Orrore ... non avevo visto che usava le String ... (http://www.nikonland.eu/forum/public/style_emoticons/default/vomitarella.gif)

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
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:11 pm
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());
  }
}
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:12 pm
No la struttura esatta non la conosco! Ho preso solo quel valore letto con lo sketch precedente
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:12 pm
Cioé ... non hai alcuna documentazione relativa a quel lettore che ti spiega cosa tu debba aspettarti ???  :smiley-eek:

Guglielmo
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 03:15 pm

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

String in realtà è un oggetto di C++.
Dentro incapsula un array di caratteri. Cerca di nasconderti come è fatta una stringa (array di caratteri) in C/C++.
Sarebbe meglio usare un array di caratteri (stringa da non confondere con String).
Secondo me, visto che sei agli inizi, lo String ti semplifica. Ma sarebbe meglio passare alle stringhe. Soprattutto su programmi più grossi.  
Quella "somma" di caratteri:
Code: [Select]
confronto = confronto +  (char) Serial.read();ad esempio può mangiare la memoria
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:15 pm
No purtroppo no perchè non è un mio sensore. Io so la sigla del controller che è il rdm6300 e basta
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:21 pm
... e si fa fatica a fare una ricerca con Google ???  ]:D

Guarda QUI (http://www.seeedstudio.com/depot/datasheet/RDM630-Spec..pdf) e ... vai a studiare l'ultima pagina ... vedrai che è come immaginavo io ;)

Guglielmo
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 03:25 pm
Ok visto che usa degli start bit e degli stop bit è impossibile sapere la sua struttura che invia?
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:26 pm
Ma hai letto tutta la pagina dall'INIZIO ???  :smiley-eek: :smiley-eek: :smiley-eek: Eppure è ben descritto :

STX (ASCII 0x02)

10 char che rappresentano, il numero di TAG

1 char che è il checksum calcolato facendo l'XOR di coppie di caratteri che rappresentano un valore HEX

ETX (ASCII 0x03)

... in tutto ... 13 char, ma solo i 10 in mezzo sono il TAG, gli altri sono codici di controllo del protocollo di trasmissione !

Guglielmo
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 03:35 pm

Code: [Select]
-1
-1
-1
2
48
51
48
48
51
48
65
50
55
56
69
57

Certo, -1 e -1 erano perché non aspettavi la Serial.available() e, se non c'è nulla, la Serial.read() ritorna -1
2, 48,51,48,48,51,48,65,50,55,56,69,57 altro non sono che i caratteri ricevuti, UNO alla volta, stampati in valore decimale, il cui equivalente ASCII è : STX  0 3 0 0 3 0 A 2 7 8 E 9


Come ti aveva detto @Guglielmo qui.  
Lo strano però è che secondo quella guida dopo 10 cifre+checksum dovrebbe esserci un valore 3 e non il carattere '9' ( valore 59)
STX(2)    poi  '0' '3' '0' '0' '3' '0' 'A' '2' '7' '8'   poi checksum 'E'   e poi doveva esserci un ETX(3)   
Non è che il tuo rfid sia un clonazzo non originale?
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:36 pm
@nid : mi sa che quando ha fatto copia e incolla .. s'è mangiato un pezzo ;)

No, effettivamente sono 13 char ... c'è qualche cosa che non va in quei valori ...

Guglielmo
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 03:43 pm
Qui un esempio MA in inglese e per PIC
http://zjembedded.blogspot.it/2012/06/rdm6300-rfid-with-pic18-dev-board.html

Ma si vede dal codice che aspetta arrivi il valore STX (ovvero 2) ma poi conta 13 caratteri, non aspetta di ricevere un ETX.
Code: [Select]
if (tagComingFlag == 0 && rxByte == 0x02)           <--- QUI SI CHIEDE SE C'E' UN    STX  (valore 2)
{ tagRX[tagCounter] = rxByte;
  tagComingFlag = 1;
  tagCounter++;                                                        <-- CONTATORE DI QUANTI CARATTERI STIAMO LEGGENDO
}
else if (tagComingFlag == 1)
{ tagRX[tagCounter] = rxByte;
  tagCounter++;
  if (tagCounter == 14)                       <---- QUI QUANDO ARRIVA A 13 CARATTERI VERIFICA IL TAG
....
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:44 pm
No, è giusto, manca un pezzo ...

Abbiamo STX (02)

Abbiamo i 10 char (48 51  48 48  51 48  65 50  55 56) = 03  00  30  A2  78 (li ho separati apposta per far vedere come vanno presi per il calcolo dell'XOR, ma ciascuno, di perse è un char ...

se facciamo : 03 XOR 00 XOR 30 XOR A2 XOR 78 ... otteniamo .. E9 ... che, non so perché, viene trasmesso come due char E e 9 ... mentre dal datasheet sembrava un solo char ...  :smiley-roll:

Manca quindi lo 03 finale ...

Guglielmo
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 03:47 pm
@nid : Quindi ... stando al tuo esempio ... se ne fregano dello ETX ... tanto se quadra il checksum ... il dato è sicuramente buono ;)

Guglielmo
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 03:53 pm
Beh, leggendo bene la prima parte di quel link che ho messo, anche il tipo dichiara che il datasheet (o forse data-shit) dichiara un 3 finale ma lui con una decina di RFID non lo ricere mai. Sempre il 2 iniziale ma mai il 3 finale.
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:00 pm
L'ho letta si ma io le unico competenze che ho sono di programmazionie informatica e di sistemi e reti non di certo queste cose. Mi hanno dato da fare questo progettino in due giorni senza nessun riferimento e a questo punto credo sia più che normale non capirci davvero nada  :smiley-sad-blue:
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 04:04 pm

L'ho letta si ma io le unico competenze che ho sono di programmazionie informatica e di sistemi e reti non di certo queste cose.


Bé ... veramente qui si tratta solo di programmazione ...  :smiley-roll:

... c'è da fare un controllo sui caratteri che arrivano, quando arriva STX (02) si parte e si accumulano i successivi 12 car, si fa come ti ho spiegato per calcolare il checksum e, se quadra, il dato è buono ! Tutto qui ...

Guglielmo
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:07 pm
Si ma a me il primo dato che arriva è 03 non 02
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 04:08 pm
NON è vero ... lo hai scritto tu stesso quando hai riportato i caratteri che ricevevi (-1, -1, 2, ...) !!!

Guglielmo
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:10 pm
Quando arriva il valore 2 allora vuol dire che inizia una trasmissione e puoi usare ReadBytes() e leggi 13 caratteri:
http://arduino.cc/en/Serial/ReadBytes
Poi puoi calcolare il checksum o fregartene, se devi solo controllare che il tag sia uguale a uno noto.
Cioè se per te 030030A278E9   questo è il tag da controllare, sapere che E9 è il checksum non è molto importante.

No, a te il primo dato che arriva è il valore 2 (che non puoi stampare come carattere a video)
poi ti arrivano i caratteri '0', '3' .... etc.
Quello 03 non è il valore 3 ma il carattere '0' e poi '3';  molto diverso.  Sono i valori 48 e 51
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:18 pm
Questo solo il pezzo modificato nella loop(), e togli per ora il confronto con tag. Ti funziona così, leggi il RFID ?
Code: [Select]

void loop()
{ if(Serial.available()>0)
 { while(Serial.available()>0)
   { for(int i=0; i<14 ;i++)                   // 14 char, c'e' a inizio valore 2 da scartare
     { int c=Serial.read();
       if(c != 2) confronto = confronto +  (char) c;
     }
   }
   Serial.print(">");Serial.print(confronto);Serial.println("<");
 }
}


Dovrebbe stampare           >030030A278E9<
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:25 pm
Ma quelli li ricevevo solo non inserendo serial.available()
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:31 pm
beh, io mi son fidato del tuo codice.
Qui: http://forum.arduino.cc/index.php?topic=211192.msg1549567#msg1549567
vedo che @Babbuino ti fa leggere con SoftwareSerial  ma perchè poi hai cambiato il codice?
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:33 pm
Ripartiamo da quello:
Code: [Select]

#include <SoftwareSerial.h>

const byte pinRX=2;
const byte pinTX=3;

SoftwareSerial RfidData =  SoftwareSerial(pinRX, pinTX);   //creo una nuova porta seriale via software

void setup()  
{ pinMode(pinRX, INPUT);  //definisco il pin2(RX) come ingresso
 pinMode(pinTX, OUTPUT); //definisco il pin3(TX) come uscita
 RfidData.begin(9600); //setto la velocita delle seriali  (software e hardware)
 Serial.begin(9600);
}

void loop()
{ if( RfidData.available()>0 )
 {  int c= RfidData.read();
    Serial.print( (char) c); Serial.print(" - " );Serial.println(c);
 }
}


Mi aspetto che ti stampi 14 righe, ogni riga uno dei valori ricevuti, stampando valore e carattere ascii corrispondente
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:37 pm
Usando il tuo ultimo sketc ottengo questa cosa:
Code: [Select]
 - 2
0 - 48
3 - 51
0 - 48
0 - 48
3 - 51
0 - 48
A - 65
2 - 50
7 - 55
8 - 56
E - 69
9 - 57
 - 3
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:42 pm
Come vedi da quell'elenco alla fine anche il 3 arriva.

Aggiungiamo i pezzi. Occhio alle aggiunte anche nella prima parte:
Code: [Select]

#include <SoftwareSerial.h>

const byte pinRX=2;
const byte pinTX=3;

SoftwareSerial RfidData =  SoftwareSerial(pinRX, pinTX);   //creo una nuova porta seriale via software
String TagRicevuto;
String TagValido="030030A278E9";

void setup()  
{ pinMode(pinRX, INPUT);     //definisco il pin2(RX) come ingresso
 pinMode(pinTX, OUTPUT);    //definisco il pin3(TX) come uscita
 RfidData.begin(9600);      //setto la velocita delle seriali  (software e hardware)
 Serial.begin(9600);
}

void loop()
{ if( RfidData.available()>0 )
 { while( RfidData.available()>0 )
   { for(int i=0; i<14 ;i++)                   // 14 char, c'e' a inizio valore 2 da scartare
     { int c=RfidData.read();
       if(c != 2) TagRicevuto= TagRicevuto+  (char) c;
     }
   }
   Serial.print(">"); Serial.print(TagRicevuto); Serial.println("<");
   TagRicevuto="";         // azzeriamo la String altrimenti cresce a dismisura
 }
}
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:45 pm
confronto non viene dichiarato lo metto di tipo string immagino?
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:46 pm

confronto non viene dichiarato lo metto di tipo string immagino?

Sei troppo veloce, ho ricorretto il codice.  :smiley-mr-green:
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:47 pm
:) :) :)
In output ora ho una roba del genere.
Code: [Select]
>030030A278E9<
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 04:49 pm
@nid : è concettualmente sbagliato ...
... per fare una cosa fatta bene devi ciclare finche non ricevi il 2 e allora parti a leggere i dati  ...

Code: [Select]
if( RfidData.available()>0 ) {
 if ( RfidData.read() == 2) {
   while ....
   ...
 }
}


Guglielmo
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:51 pm
Che è il tag che ti aspetti e davanti e dietro non c'e' nulla di strano (importante).

Aggiungiamo il pezzo di controllo:
Code: [Select]

#include <SoftwareSerial.h>

const byte pinRX=2;
const byte pinTX=3;

SoftwareSerial RfidData =  SoftwareSerial(pinRX, pinTX);   //creo una nuova porta seriale via software
String TagRicevuto;
String TagValido="030030A278E9";

void setup()  
{ pinMode(pinRX, INPUT);     //definisco il pin2(RX) come ingresso
 pinMode(pinTX, OUTPUT);    //definisco il pin3(TX) come uscita
 RfidData.begin(9600);      //setto la velocita delle seriali  (software e hardware)
 Serial.begin(9600);
}

void loop()
{ if( RfidData.available()>0 )
 { while( RfidData.available()>0 )
   { for(int i=0; i<14 ;i++)                   // 14 char, c'e' a inizio valore 2 da scartare
     { int c=RfidData.read();
       if(c != 2) TagRicevuto= TagRicevuto+  (char) c;
     }
   }
   Serial.print(">"); Serial.print(TagRicevuto); Serial.println("<");
   if(TagRicevuto==TagValido)
   { Serial.println("Tag valido.");
   }
   else
   { Serial.println("Tag NON valido.");
   }
   TagRicevuto="";         // azzeriamo la String altrimenti cresce a dismisura
 }
}
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 04:53 pm

@nid : è concettualmente sbagliato ...


Ok. Ti spiace però correggere il mio codice solo dopo che abbiamo verificato che @pres riesca a verificare il tag?
Mi fa schifo verede un for la dentro e mi fan schifo le String. Ma vorrei prima arrivare alla conferma del tag.  :smiley-mr-green:
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:54 pm
Ora in output mi da il tag e la scritt tag non valido.
Code: [Select]

>030030A278E9<
Tag NON valido.
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 04:57 pm
Ho riguardato la logica dell'if in teoria dovrebbe dare tag valido...
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 05:04 pm
Aggiungiamo il pezzo di controllo suggerito da @Guglielmo e scartiamo il valore 3:
Code: [Select]

#include <SoftwareSerial.h>

const byte pinRX=2;
const byte pinTX=3;

SoftwareSerial RfidData=SoftwareSerial(pinRX, pinTX);   //creo una nuova porta seriale via software
String TagRicevuto;
String TagValido="030030A278E9";

void setup()  
{ pinMode(pinRX, INPUT);     //definisco il pin2(RX) come ingresso
 pinMode(pinTX, OUTPUT);    //definisco il pin3(TX) come uscita
 RfidData.begin(9600);      //setto la velocita delle seriali  (software e hardware)
 Serial.begin(9600);
}

void loop()
{ if( RfidData.available()>0 )
 { if ( RfidData.read() == 2 )     // se inizia con valore 2 allora ci son da leggere 13 char + valore 3
   { while( RfidData.available()>0 )
     { for(int i=0; i<14 ;i++)                   // 14 char, c'e' a fine valore 3 da scartare
       { int c=RfidData.read();
         if(c != 3) TagRicevuto = TagRicevuto +  (char)c;
       }
     }
     Serial.print(">"); Serial.print(TagRicevuto); Serial.println("<");
     if(TagRicevuto==TagValido)     // oppure if( TagRicevuto.startWith(TagValido) )
     { Serial.println("Tag valido.");
     }
     else
     { Serial.println("Tag NON valido.");
     }
     TagRicevuto="";         // azzeriamo la String altrimenti cresce a dismisura
   }
 }
}

Title: Re: Rfid RDM6300
Post by: PaoloP on Jan 17, 2014, 05:34 pm
Ciao Nid
Perche metti
Code: [Select]
{ int c=RfidData.read();
e non
Code: [Select]
{ char c=RfidData.read();
?
Title: Re: Rfid RDM6300
Post by: pres961 on Jan 17, 2014, 05:51 pm
Ma per quale strano motivo continua a darmi tag non valido?
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 06:02 pm

Ciao Nid
Perche metti
Code: [Select]
{ int c=RfidData.read();
e non
Code: [Select]
{ char c=RfidData.read();
?


No notato che read() almeno della Serial ritorna un int e non un char.
Title: Re: Rfid RDM6300
Post by: PaoloP on Jan 17, 2014, 06:08 pm

Ma per quale strano motivo continua a darmi tag non valido?


Perchè le 2 stringe sono diverse.
Forse serve il carattere terminatore /0 ma non ne sono sicuro.
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 06:36 pm

Ma per quale strano motivo continua a darmi tag non valido?


Hai provato con nuova versione e usando startWith() ?
Code: [Select]
if( TagRicevuto.startWith(TagValido) ) // oppure if(TagRicevuto==TagValido)     
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 06:42 pm

Ho notato che read() almeno della Serial ritorna un int e non un char.


L' int è sbagliato (... anche se erroneamente indicato), in realtà è chiaramente scritto che :

Quote
Returns the first byte of incoming serial data available (or -1 if no data is available)


e quindi, visto che è signed, usa char ;)

Guglielmo

P.S. : Il codice di Arduino, se lo vai a vedere, è scritto con i piedi ... è vero che la read() è definita ritornare un int, peccato che poi nel codice leggano i dati in un "unsigned char c" e fanno il "return c", o -1 se non ci sono dati ... mah ...  :smiley-roll:
Title: Re: Rfid RDM6300
Post by: PaoloP on Jan 17, 2014, 06:46 pm
Se fosse dichiarata unsigned char non potrebbe restituire -1  :smiley-mr-green:
Se la metti char non prende il 128° carattere e sucessivi... ergo la dichiari int e tagli la testa al torello.
Title: Re: Rfid RDM6300
Post by: nid69ita on Jan 17, 2014, 06:51 pm

Se fosse dichiarata unsigned char non potrebbe restituire -1  :smiley-mr-green:
Se la metti char non prende il 128° carattere e sucessivi... ergo la dichiari int e tagli la testa al torello.


Bastardissima sta cosa. Non ci avevo pensato, tutto per poter sputare il -1     :smiley-mr-green:
Title: Re: Rfid RDM6300
Post by: gpb01 on Jan 17, 2014, 06:59 pm

Se la metti char non prende il 128° carattere e sucessivi... ergo la dichiari int e tagli la testa al torello.


Ribadendo che il codice è scritto con il cuxo ... normalmente trasmetti caratteri ASCII standard che vanno da 00 (NUL) a 127 (DEL) ... quindi la char basta e avanza ;)

Nei casi invece debba trasmettere valori binari ... usi Serial.available() per sapere che ci sono dei dati e usi unsigned char per la Serial.read() ... e la cosa è formalmente più corretta !!!

Guglielmo