arduino 串口命令解析
/* DS3231_test.pde Eric Ayars 4/11 Test/demo of read routines for a DS3231 RTC. Turn on the serial monitor after loading this to check if things are working as they should. */ #include <DS3231.h> #include <Wire.h> #include <EEPROM.h> #define powerPin 7 DS3231 Clock; String ReceivedCache=""; String BTime="2010-07-24 11:15:00"; String ETime="2010-07-24 11:15:00"; boolean isFire=false; void setup() { // Start the I2C interface Wire.begin(); Clock.setClockMode(false); Serial.begin(9600); pinMode(powerPin,OUTPUT); digitalWrite(powerPin,LOW); Clock.turnOnAlarm(1); RetrieveFireSet(); } void loop() { handleCmd(); checkFire(); } void checkFire(){ String dateTime=GetTime(); if(dateTime>=BTime && dateTime<=ETime){ digitalWrite(powerPin,HIGH); isFire=true; }else{ digitalWrite(powerPin,LOW); isFire=false; } } String formatNum(int a){ if(a<10)return "0" +(String)a; return (String)a; } String GetTime(){ bool Century=false; bool h12=false; bool PM=false; int second,minute,hour,date,month,year,temperature; second=Clock.getSecond(); minute=Clock.getMinute(); hour=Clock.getHour(h12, PM); date=Clock.getDate(); month=Clock.getMonth(Century); year=Clock.getYear(); String dateTime="20" +formatNum(year) +"-" +formatNum(month) +"-" +formatNum(date) +" " +formatNum(hour) +":" +formatNum(minute)+":" +formatNum(second); return dateTime; } void handleGetTime(){ String dateTime=GetTime(); Serial.println("OK:"+dateTime); } void handleSetTime(){ int second,minute,hour,date,month,year,dayOfWeek; String dateTime=ReceivedCache.substring(5,24); year =dateTime.substring(2,4).toInt(); month =dateTime.substring(5,7).toInt(); date=dateTime.substring(8,10).toInt(); hour=dateTime.substring(11,13).toInt(); minute=dateTime.substring(14,16).toInt(); second=dateTime.substring(17,19).toInt(); dayOfWeek=dateTime.substring(20,21).toInt(); Clock.setSecond(second);//Set the second Clock.setMinute(minute);//Set the minute Clock.setHour(hour); //Set the hour Clock.setDoW(dayOfWeek); //Set the day of the week Clock.setDate(date); //Set the date of the month Clock.setMonth(month); //Set the month of the year Clock.setYear(year); //Set the year (Last two digits of the year) Serial.println("OK:"); } void handleGetFire(){ String tmp=_ReadFireSet(); if(tmp==""){ Serial.println("EE:fire time not set!"); }else{ Serial.println("OK:" + tmp); } } void handleSetFire(){ for(int address=0;address<43;address++){ EEPROM.write(address,(byte)ReceivedCache[address]); //Serial.print((char)EEPROM.read(address)); } //Serial.println(""); String bTime=ReceivedCache.substring(5,24); String eTime=ReceivedCache.substring(24,43); bool flag=RetrieveFireSet(); // Serial.println("flag:" + (String)flag); if(flag && (bTime==BTime && eTime==ETime)){ Serial.println("OK:"); }else{ Serial.println("EE:Set Fail"); } } String _ReadFireSet(){ int address=0; String tmp=""; char readChar=' '; for(int address=0;address<5;address++){ readChar=(char)EEPROM.read(address); tmp +=readChar; } if(tmp!="SetF:"){ return ""; } tmp=""; for(int address=5;address<43;address++){ readChar=(char)EEPROM.read(address); tmp +=readChar; } //Serial.println(tmp); return tmp; } bool RetrieveFireSet(){ String tmp=_ReadFireSet(); if(tmp==""){ return false; }else{ BTime=tmp.substring(0,19); ETime=tmp.substring(19,38); return true; } } //read Serial data and hand command // void handleCmd(){ char readChar=' '; while(Serial.available()>0){ readChar=(char)Serial.read(); ReceivedCache =ReceivedCache+ (String)readChar; //delayMicroseconds(10); } //Serial.println("ABC"); // Serial.println(ReceivedCache); if(ReceivedCache.startsWith("GetT:")){ handleGetTime(); ReceivedCache=ReceivedCache.substring(5); }else if(ReceivedCache.startsWith("SetT:")){ //like->SetT:2015-07-24 16:54:23,7 if(ReceivedCache.length()>=26){ handleSetTime(); ReceivedCache=ReceivedCache.substring(26); } }else if(ReceivedCache.startsWith("GetS:")){ Serial.println("OK:"+(String)isFire); ReceivedCache=ReceivedCache.substring(5); }else if(ReceivedCache.startsWith("GetF:")){ handleGetFire(); ReceivedCache=ReceivedCache.substring(5); }else if(ReceivedCache.startsWith("SetF:")){ if(ReceivedCache.length()>=43){ handleSetFire(); ReceivedCache=ReceivedCache.substring(43); } }else if(ReceivedCache.startsWith("GetC:")){ int temperature=Clock.getTemperature(); Serial.println("OK:" +(String)temperature); ReceivedCache=ReceivedCache.substring(5); } else{ if(ReceivedCache.length()>=5){ ReceivedCache=""; } } if(readChar=='\n')ReceivedCache=""; }