簡體   English   中英

結合RFID讀寫器接收USB串口數據到arduino

[英]Receive USB serial data in arduino in combination with RFID reader

我正在做一個 Arduino 項目。 Arduino 板在掃描 RFID 標簽時將時間戳和 RFID 代碼保存到 ROM。 RFID 數據由Serial.read()接收,但現在我需要將存儲的數據從我的 Arduino ROM 獲取到我的計算機。

為此,我必須讀取串行數據(在本例中使用 C#)並且工作正常。 但是因為我的 Arduino 板需要知道何時將數據寫入串口,所以我首先需要向 Arduino 板發送命令。

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

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

一些信息:

  • Arduino 歐諾
  • RFID 閱讀器:創新 ID12
  • RTC時鍾模塊
  • C
  • 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("}");     
}

arduino UNO只有1個串口,pin 0和1實際連接到usb端口。

您將需要使用softwareserial在軟件中創建一個串行端口以與您的 RFID 讀取器通信並將 RFID 讀取器連接到其他引腳,然后是 0 和 1

Sibster 是正確的引腳 0 和 1 用於硬件串行和 USB 連接到 PC。 為 RFID 使用 SPI、I2c 或軟件序列(取決於你有什么)。 另外,您最好使用 SD 卡。

當你從 arduino ide 讀取時,
如果您輸入一個實際上等於50'2'作為('0'==48)

嘗試將if語句更改為readByte != '2'

除非您輸入某種實際上等於2的控制字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM