Arduino con lector de RFID Parallax almacenando variables en caracteres

1

Soy bastante nuevo en electrónica y he estado jugando con este Arduino UNO w / WiFi Shield y el Parallax RFID R / W Module.

Enlace al módulo RFID: enlace

Enlace a su hoja de datos: enlace

Por lo tanto, actualmente he estado usando el código que he encontrado en el Arduino Playground, que he adaptado.

Namely: http://playground.arduino.cc/Learning/ParallaxRFIDreadwritemodule

Also: http://playground.arduino.cc/Learning/PRFID

(Este último es el módulo anterior de sólo lectura, pero resultó útil debido a la verificación de errores involucrada).

Objetivo: Para poder leer una etiqueta, almacenar con éxito en una matriz de caracteres, o lo que sea más apropiado, sería preferible el formato de bytes para no perder ningún número más pequeño cuando se convierte a DEC. También necesito que el valor de la matriz se asigne a otro valor para que la matriz se pueda vaciar por la presencia de otra tarjeta.

Tengo un programa de semi-trabajo, sin embargo, el monitor de serie muestra basura

Initialised Serial Port at 9600bps
Initialising SD card...
SD card initialisation done.
Nothing to clear on SD card.
Code is: üÖ©ÿÿÿÿÿÿ
Code is: üºÿÿÿÿÿÿ

Tengo la sensación de que tiene que ver con un bit de detención después de que se haya llenado la matriz, pero no puedo estar seguro. Estoy 100% seguro de que mi monitor Serial está configurado en baudios correctos 9600.

Código:

#include <SoftwareSerial.h> // SoftwareSerial to power the serial communications;
/** End inclusion of libraries
    */

#define RFID_READ 0x01 // Enable READ
#define RFID_WRITE 0x02 // Enable WRITE
#define ERR_OK 0x01 // Error checking
#define STOP_BYTE 0x0D // last byte recieved from a tag
#define CODE_LEN 11 // length of code
#define TERMINATOR 0x00
#define txPin 6 // Enable digital pin 6
#define rxPin 8 // Enable digital pin 8

#define readMemorySector 32 // Define variable for accessing various memory sectors on a card

// Initialise SoftwareSerial to input and output pins for mySerial
SoftwareSerial mySerial(rxPin, txPin);

//int val; // Buffer to store value when reading from a card, before printing to the serial monitor
int runs = 0; // Run counter
char code[CODE_LEN];
int bytes_read = 0;

void setupRFIDREAD()
{
   /** Set up RFID READ
   */
  mySerial.begin(9600); // initialises the rxPin and txPin using mySerial
  pinMode(txPin, OUTPUT); // defines txPin as OUTPUT   
  pinMode(rxPin, INPUT);  // defines rxPIN as INPUT

  //digitalWrite(6, LOW); // Enable reader

      /** Set up SD Card
  */
  Serial.println(F("Initialising SD card...")); // Initialising SD Card 

  pinMode(10, OUTPUT); //Initialises the sdPin as an output, even if it's not used
  digitalWrite(10, HIGH); // Disable WiFi SPI link before starting the SD cards as both use the same SPI Bus

  if (!SD.begin(4)) { // see if the card is present and can be initialized:
    Serial.println(F("initialisation failed, card faulty or not present!"));
    return; // don't do anything more
  }

  Serial.println(F("SD card initialisation done."));

  //clear the SD card
  if (SD.exists("test.txt")) {
    SD.remove("test.txt");
    Serial.println(F("SD card cleared."));
  } else {
    Serial.println(F("Nothing to clear on SD card."));
    return;
  }

}

void loopRFIDREAD()
{
  int val;    

  mySerial.print("!RW"); //To communicate with the RFID Read/Write Module, the user must first send a three-byte header string of !RW (in ASCII), followed by the desired single-byte command (in hexadecimal).
  mySerial.write(byte(RFID_READ)); //Initiates the read function.
  mySerial.write(byte(readMemorySector));  // Indicates which memorySector is to be read. In this case 32 which is the unique identifier.

  if(mySerial.available() > 0) {
    if((val = mySerial.read()) == ERR_OK){
      bytes_read = 0;
      while(bytes_read < CODE_LEN) {
        if(mySerial.available() > 0) {
          val = mySerial.read();
            if(( val == ERR_OK) || (val == STOP_BYTE))
              break;
    code[bytes_read] = val;
    bytes_read++;
  }
  }

 if(bytes_read == CODE_LEN) {
    Serial.print("Code is: ");
    Serial.println(code);
  }
  bytes_read = 0;

    digitalWrite(6, HIGH); // Disable reader as not to flood it
// Delay 750 milliseconds before next read and print cycle
delay(750);
    digitalWrite(6, LOW); // Enable reader
}
}
}

Ignore la funcionalidad de la tarjeta SD que se usa para otra parte del programa.

Como puede ver, he cambiado el código drásticamente del código proporcionado en el patio de recreo para este módulo de R / W, ya que el código se repite sin ninguna verificación y hace que sea muy difícil controlar la salida. Por lo tanto, combiné el código de la versión anterior del lector.

Entonces, el objetivo final es poder leer y almacenar la ID de un fob en esta matriz de caracteres, que luego se consultará en un servidor web para obtener datos adicionales.

Espero que pueda ayudar, si necesita más detalles, pregunte.

    
pregunta user20414

1 respuesta

1

Lo que se almacena en la matriz code[] es una serie de valores binarios:

  

código [bytes_read] = val;

Los valores reales recuperados por val = mySerial.read(); son los valores más probables de 0x00 a 0xff (0 a 255 en decimal).

  1. Debe decidir cómo desea que se muestren esos valores de byte: como pares de dígitos hexadecimales ( 00 .. ff ), como números decimales ( 0 .. 255 ) o como representaciones ASCII de esos valores (que es lo que está sucediendo ahora).

    • Tenga en cuenta que los valores de bytes hasta 31 no tienen una representación visual estándar (por lo tanto, los caracteres no deseados), 32 es un espacio, 33 en adelante son símbolos, números, letras y así sucesivamente hasta el valor 127.
    • 128 a 255 nuevamente tienen representaciones diferentes en diferentes sistemas, "ASCII extendido"
  2. Además de esto, una cadena C consta de una serie de caracteres ASCII terminados por un valor de null , o 0. Sin terminar adecuadamente una cadena, print() y println() no terminarán de manera significativa la cadena mostrada.

En resumen, deberá adoptar una de las varias formas de mostrar los valores de bytes en forma legible. Un poco de búsqueda en la web o en StackOverflow debería mostrarle varios algoritmos para lograr esto en C.

Solo entonces verá lo que espera ver en el monitor de serie.

    
respondido por el Anindo Ghosh

Lea otras preguntas en las etiquetas