0

私はArduinoプロジェクトに取り組んでいます。Arduinoボードは、RFIDタグがスキャンされるときに、タイムスタンプとRFIDコードをROMに保存します。RFIDデータはによって受信されSerial.read()ますが、保存されたデータをArduinoROMからコンピューターに取得する必要があります。

これを行うには、シリアルデータ(この場合は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つしかなく、ピン0と1は実際にはUSBポートに接続されています。

softwareserialを使用して、RFIDリーダーと通信し、RFIDリーダーを他のピンに接続してから0と1に接続するために、ソフトウェアにシリアルポートを作成する必要があります。

于 2012-04-05T20:03:13.323 に答える
0

シブスターは正しいピン0と1は、PCへのハードウェアシリアルおよびUSB接続に使用されます。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 に答える