2012-04-05 12 views
0

Ich arbeite an einem Arduino-Projekt. Die Arduino-Karte speichert einen Zeitstempel und RFID-Code im ROM, wenn ein RFID-Tag gescannt wird. Die RFID-Daten werden von Serial.read() empfangen, aber jetzt muss ich die gespeicherten Daten von meinem Arduino ROM auf meinen Computer holen.Empfangen Sie serielle USB-Daten in Arduino in Kombination mit RFID-Reader

Dazu muss ich die seriellen Daten lesen (in diesem Fall mit C#) und das funktioniert gut. Aber da mein Arduino-Board wissen muss, wann Daten in die serielle Schnittstelle geschrieben werden sollen, muss ich zuerst einen Befehl an die Arduino-Platine senden.

Mit "Serial Monitor" von Arduino IDE habe ich versucht, einige Daten zu senden, aber es wird nicht vom Arduino empfangen. Wenn ich ein RFID-Tag vor das RFID-Element lege, empfängt das Arduino-Board Daten. So scheint es mir, als ob der Eingang der seriellen Schnittstelle irgendwie vom RFID-Leser reserviert ist? Ist das überhaupt möglich?

Kennt jemand eine Lösung für mein Problem? Beachten Sie, dass dies mein erstes Arduino-Projekt ist und C für mich neu ist.

Einige Informationen:

  • Arduino UNO
  • RFID Reader: Innovationen ID12
  • RTC Clock Modul
  • C
  • C#
  • .NET

Der Code drunter ist das ganze Arduino-Projekt.

#include "Wire.h" 
#include <EEPROM.h> 
#include "EEPROMAnything.h" 

#define DS1307_ADDRESS 0x68 
byte zero = 0; //workaround for issue #527 
int buttonState = 0; 
byte value; 
int byteaddress = 0; 
int bytesize = 0; 
int lastTag = 0; 
byte incomingByte; 

struct config_t 
{ 
    int seconds; 
    int hours; 
    int minutes; 
} timestamp; 

int RFIDResetPin = 13; 

//Register your RFID tags here 
char tag1[13] = "03000DEB55B0"; 
char tag2[13] = "03000DB88137"; 
char tag3[13] = "03000DC8E026"; 
char tag4[13] = "03000623FBDD"; 
char tag5[13] = "03000DB8B701"; 

void setup() 
{ 
    pinMode(7, INPUT); 
    Wire.begin(); 

    Serial.begin(9600); 

    pinMode(RFIDResetPin, OUTPUT); 
    digitalWrite(RFIDResetPin, HIGH); 

    EEPROM_readAnything(0, timestamp); 
    setDateTime(); //MUST CONFIGURE IN FUNCTION 

    pinMode(11, OUTPUT); 
} 

void loop() 
{ 
    buttonState = digitalRead(7); 

    char tagString[13]; 
    int index = 0; 
    boolean reading = false; 

    if (buttonState == HIGH) { 
    // turn LED on:  
    printDate(); 
    delay(200); 
    } 

    while(Serial.available()){ 

    buttonState = digitalRead(7); 

    int readByte = Serial.read(); //read next available byte 

    if(readByte == 2) reading = true; //begining of tag 
    if(readByte == 3) reading = false; //end of tag 

    if(reading && readByte != 2 && readByte != 10 && readByte != 13){ 
     //store the tag 
     tagString[index] = readByte; 
     index ++; 
    } 

    incomingByte = Serial.read(); 
    Serial.println(incomingByte); 
    } 

    checkTag(tagString); //Check if it is a match 
    clearTag(tagString); //Clear the char of all value 
    resetReader(); //eset the RFID reader 
} 

void checkTag(char tag[]){ 
/////////////////////////////////// 
//Check the read tag against known tags 
/////////////////////////////////// 

    int currentTag = 0; 

    if(strlen(tag) == 0 || strlen(tag) < 12) 
    return; //empty, no need to continue 

    if(compareTag(tag, tag1) && lastTag != 1){ // if matched tag1, do this 
    Serial.println("Scanned tag 1"); 
    lastTag = 1; 
    currentTag = 1; 
    printDate(); 
    bleepSucces(11); 
    } 
    else 
    if(compareTag(tag, tag2) && lastTag != 2){ //if matched tag2, do this 
    Serial.println("Scanned tag 2"); 
    lastTag = 2; 
    currentTag = 2; 
    printDate(); 
    bleepSucces(11); 
    } 
    else 
    if(compareTag(tag, tag3) && lastTag != 3){ 
    Serial.println("Scanned tag 3"); 
    lastTag = 3; 
    currentTag = 3; 
    printDate(); 
    bleepSucces(11); 
    } 
    else 
    if(compareTag(tag, tag4) && lastTag != 4){ 
    Serial.println("Scanned tag 4"); 
    lastTag = 4; 
    currentTag = 4; 
    printDate(); 
    bleepSucces(11); 
    } 
    else 
    if(compareTag(tag, tag5) && lastTag != 5){ 
    Serial.println("Scanned tag 5"); 
    lastTag = 5; 
    currentTag = 5; 
    printDate(); 
    bleepSucces(11); 
    } 
    else 
    { 
    if(currentTag == 0 && lastTag == 0){ 
     Serial.println("Unknown Tag, see below:"); 
     Serial.println(tag); //read out any unknown tag 
     //resetReader(); 
     lastTag = 0; 
     bleepFail(11); 
    } 
    return; 
    } 
} 

void bleepSucces(int pin) 
{ 
    digitalWrite(pin, HIGH); 
    delay(300); 
    digitalWrite(pin, LOW); 
    delay(20); 
    digitalWrite(pin, HIGH); 
    delay(150); 
    digitalWrite(pin, LOW); 
} 

void bleepFail(int pin) 
{ 
    digitalWrite(pin, HIGH); 
    delay(1200); 
    digitalWrite(pin, LOW); 
} 

void resetReader() 
{ //Reset the RFID reader to read again. 
    digitalWrite(RFIDResetPin, LOW); 
    digitalWrite(RFIDResetPin, HIGH); 
    delay(150); 
} 

void clearTag(char one[]) 
{ 
//clear the char array by filling with null - ASCII 0 
//Will think same tag has been read otherwise 
    for(int i = 0; i < strlen(one); i++) 
    one[i] = 0; 
} 

boolean compareTag(char one[], char two[]) 
{ //compare two tags to see if same, 
    //strcmp not working 100% so we do this 

    if (strlen(one) == 0) 
    return false; //empty 

    for(int i = 0; i < 12; i++){ 
    if(one[i] != two[i]) 
     return false; 
    } 
    return true; //no mismatches 
} 

void setDateTime() 
{ 
    byte second =  20; //0-59 
    byte minute =  37; //0-59 
    byte hour =  20; //0-23 
    byte weekDay =  2; //1-7 
    byte monthDay = 3; //1-31 
    byte month =  4; //1-12 
    byte year =  12; //0-99 

    Wire.beginTransmission(DS1307_ADDRESS); 
    Wire.write(zero); //stop Oscillator 

    Wire.write(decToBcd(second)); 
    Wire.write(decToBcd(minute)); 
    Wire.write(decToBcd(hour)); 
    Wire.write(decToBcd(weekDay)); 
    Wire.write(decToBcd(monthDay)); 
    Wire.write(decToBcd(month)); 
    Wire.write(decToBcd(year)); 

    Wire.write(zero); //start 

    Wire.endTransmission(); 
} 

byte decToBcd(byte val) 
{ // Convert normal decimal numbers to binary coded decimal 
    return val/10 * 16 + val % 10; 
} 

byte bcdToDec(byte val) 
{ // Convert binary coded decimal to normal decimal numbers 
    return val/16 * 10 + val % 16; 
} 

void printDate() 
{ 
    // Reset the register pointer 
    Wire.beginTransmission(DS1307_ADDRESS); 
    Wire.write(zero); 
    Wire.endTransmission(); 

    Wire.requestFrom(DS1307_ADDRESS, 7); 

    int second = bcdToDec(Wire.read()); 
    int minute = bcdToDec(Wire.read()); 
    int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time 
    int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday - Saturday 
    int monthDay = bcdToDec(Wire.read()); 
    int month = bcdToDec(Wire.read()); 
    int year = bcdToDec(Wire.read()); 

    //Set variables in our struct 
    timestamp.hours = hour; 
    timestamp.minutes = minute; 
    timestamp.seconds = second; 

    //Save the timestamp to EEPROM 
    bytesize = EEPROM_writeAnything(byteaddress, timestamp); 
    byteaddress = byteaddress + bytesize; 

    //if (Serial.available() > 0) { 
    writeSerial(); 
    //} 
} 

void writeSerial() 
{ 
    Serial.print("{"); 
    // read a byte from the current address of the EEPROM 
    for (int i=0; i <= byteaddress + 4; i = i + 2){ 
     value = EEPROM.read(i); 
     Serial.print(value, DEC); 

     if (i < byteaddress+4) 
     Serial.print(((i-1)%3 == 0) ? ", " : " "); 
    } 
    Serial.println("}");  
} 

Antwort

1

Arduino UNO hat nur 1 seriellen Anschluss, Pin 0 und 1 actualy den USB-Anschluss verbunden ist.

Sie müssen softwareserial verwenden, um eine serielle Schnittstelle in der Software erstellen zu Ihrem RFID Reader und verbinden Sie die RFID-Leser auf andere Stifte dann 0 und 1

0

Sibster korrekt Pin 0 und 1 verwendet werden, um zu sprechen Hardware serielle und USB-Verbindung zum PC. Verwenden Sie SPI, I2c oder Software-Serien für die RFID (je nachdem, was Sie haben). Außerdem wäre es wahrscheinlich besser, eine SD-Karte zu verwenden.

0

Wenn Sie aus dem Arduino ide lesen,
, wenn Sie ein '2' das wird tatsächlich gleich 50 wie ('0'==48) eingeben.

Versuchen Sie, die if Anweisung readByte != '2'

gewechselt werden, wenn Sie irgendeine Art von Steuerzeichen tatsächlich gleich 2 eingeben.

Verwandte Themen