0

我正在做一个 Arduino 项目。扫描 RFID 标签时,Arduino 板会将时间戳和 RFID 代码保存到 ROM 中。RFID 数据已被接收,Serial.read()但现在我需要将存储的数据从我的 Arduino ROM 获取到我的计算机。

为此,我必须读取串行数据(在本例中使用 C#)并且工作正常。但是因为我的 Arduino 板需要知道何时将数据写入串口,所以我首先需要向 Arduino 板发送命令。

使用 Arduino IDE 的“串行监视器”,我尝试发送一些数据,但 Arduino 没有收到它。当我在 RFID 前面放置一个 RFID 标签时,Arduino 板确实接收到数据。所以在我看来,RFID阅读器以某种方式保留了串行端口输入?这甚至可能吗?

有人知道我的问题的解决方案吗?请注意,这是我的第一个 Arduino 项目,C 对我来说是新的。

一些信息:

  • Arduino UNO
  • RFID 阅读器:创新 ID12
  • RTC 时钟模块
  • C
  • C#
  • 。网

下面的代码是整个 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("}");     
}
4

3 回答 3

1

arduino UNO 只有 1 个串口,pin 0 和 1 实际上连接到 usb 端口。

您将需要使用softwareserial在软件中创建一个串行端口来与您的 RFID 阅读器通信,并将 RFID 阅读器连接到其他引脚,然后是 0 和 1

于 2012-04-05T20:03:13.323 回答
0

Sibster 是正确的引脚 0 和 1 用于硬件串行和 USB 连接到 PC。对 RFID 使用 SPI、I2c 或软件串行(取决于您所拥有的)。此外,您可能最好使用 SD 卡。

于 2012-04-06T07:13:02.473 回答
0

当您从 arduino ide 读取时,如果
您输入 a'2'实际上等于50.('0'==48)

尝试将if语句更改为readByte != '2'

除非你输入某种控制字符实际上等于2.

于 2012-06-28T01:40:57.280 回答