2012-04-05 131 views
0

我正在開發一個Arduino項目。當RFID標籤被掃描時,Arduino板將時間戳和RFID代碼保存到ROM中。 RFID數據由Serial.read()收到,但現在我需要將存儲的數據從我的Arduino ROM存儲到我的電腦。在Arduino中結合RFID閱讀器接收USB串行數據

要做到這一點,我必須閱讀串行數據(在這種情況下使用C#),並且工作正常。但是因爲我的Arduino開發板需要知道什麼時候將數據寫入串口,我首先需要向Arduino開發板發送命令。

使用Arduino IDE的'串行監視器',我嘗試發送一些數據,但它沒有得到Arduino的接收。當我在RFID前面放置一個RFID標籤時,Arduino板確實會收到數據。所以在我看來,串口輸入在某種程度上是由RFID閱讀器保留的?這甚至有可能嗎?

有人知道我的問題的解決方案嗎?請注意,這是我的第一個Arduino項目,C對我來說是新的。

一些信息:

  • 的Arduino UNO
  • RFID閱讀器:創新ID12
  • RTC時鐘模塊
  • Ç
  • C#
  • .NET

代碼下邊是整個Arduino項目。

#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("}");  
} 

回答

1

arduino UNO只有1個串口,引腳0和1實際連接到USB端口。

您將需要使用softwareserial的軟件來創建一個串行端口跟你的RFID閱讀器和連接RFID閱讀器其他引腳,則0和1

0

Sibster是正確的PIN碼0和1用於硬件串行和USB連接到PC。使用SPI,I2c或RFID軟件序列(取決於您擁有的)。你也許會更好使用SD卡。

0

當您從Arduino的IDE閱讀,
如果你輸入一個'2'將實際等於50('0'==48)

嘗試改變if聲明readByte != '2'

除非你正在進入某種控制字符實際上等於2的。