我正在做一个 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("}");
}