Rfid RDM6300

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 ... ;) 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 ??? ]:D

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

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?

@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

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.

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

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

Manca quindi lo 03 finale ...

Guglielmo

@nid : Quindi ... stando al tuo esempio ... se ne fregano dello ETX ... tanto se quadra il checksum ... il dato è sicuramente buono ;)

Guglielmo