Rfid RDM6300

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

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

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ì :frowning:

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 ... :wink:

Guglielmo

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

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

Io sono riuscito a leggere questo 030030A278E9

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 ... :wink:
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.

pres961:
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:

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.

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

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 ... :roll_eyes:

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

Guglielmo

No quella no l'ho ottenuto con questo sketch

void setup()
{
  Serial.begin(9600);
}
void loop()
{
  if(Serial.available())
  {
    while(Serial.available())
    Serial.write(Serial.read());
  }
}

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

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

Guglielmo

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

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: confronto = confronto +  (char) Serial.read();ad esempio può mangiare la memoria

No purtroppo no perchè non è un mio sensore. Io so la sigla del controller che è il rdm6300 e basta

... e si fa fatica a fare una ricerca con Google ??? ]:smiley:

Guarda QUI e ... vai a studiare l'ultima pagina ... vedrai che è come immaginavo io :wink:

Guglielmo

Ok visto che usa degli start bit e degli stop bit è impossibile sapere la sua struttura che invia?

Ma hai letto tutta la pagina dall'INIZIO ??? :astonished: :astonished: :astonished: 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

gpb01:

-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?