BASIC4MCU | 질문게시판 | 답변 : 답변 : 소프트웨어 시리얼로 RTC값 송수신하는 방법..
페이지 정보
작성자 master 작성일2019-01-31 11:58 조회6,252회 댓글4건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-31 오후 12:03:49// by Ok-Hyun Park//---------------------------------<송신측>void loop(){now=RTC.now(); hour_clock=now.hour(); minute_clock=now.minute(); secand_clock=now.second();mySerial.listen(); mySerial.write(hour_clock); mySerial.write(minute_clock); mySerial.write(secand_clock);if(!RTC.isrunning()){ Serial.println("RTC is NOT running!"); }else{now=RTC.now(); y=now.year(); m=now.month(); d=now.day();hour_clock=now.hour(); minute_clock=now.minute(); secand_clock=now.second();sprintf(buf,"%04d%02d%02d%02d%02d%02d\n",y,m,d,hour_clock,minute_clock,secand_clock);Serial.println(buf);}delay(1000);}//---------------------------------<수신측>bool flag=0;//void loop(){if(flag==0){ flag=1;if(mySerial.available()){r1=(byte)mySerial.read();r2=(byte)mySerial.read();r3=(byte)mySerial.read();//if (r1==12){ r1=0; }else if(r1==13){ r1=1; }else if(r1==14){ r1=2; }else if(r1==15){ r1=3; }else if(r1==16){ r1=4; }else if(r1==17){ r1=5; }else if(r1==18){ r1=6; }else if(r1==19){ r1=7; }else if(r1==20){ r1=8; }else if(r1==21){ r1=9; }else if(r1==22){ r1=10; }else if(r1==23){ r1=11; }//if(r1==){ mySerial.end(); }if(r2==){ mySerial.end(); }if(r3==){ mySerial.end(); }//hour_clock=r1*5;<-각 시 데이터에 곱하기 5를 합니다.minute_clock=r2;secand_clock=r3;}}}
flag
수신측에서 변수를 사용해서 1회만 시간을 받습니다.
//
if(mySerial.available()){r1=(byte)mySerial.read();r2=(byte)mySerial.read();r3=(byte)mySerial.read();소프트웨어 시리얼은 available() 체크를 한 후에 받아야합니다.위 소스 경우 r2,r3는 0xFF가 들어갈 수 있습니다.(int 변수 선언 시 0x00FF는 -1)제대로 동작하지 않을 것 같은데 동작한다고 하니...
//
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-01-31 오후 12:17:17// by Ok-Hyun Park//---------------------------------<송신측>void loop(){now=RTC.now(); hour_clock=now.hour(); minute_clock=now.minute(); secand_clock=now.second();mySerial.write(secand_clock); mySerial.write(minute_clock); mySerial.write(hour_clock+100);//if(!RTC.isrunning()){ Serial.println("RTC is NOT running!"); }else{now=RTC.now(); y=now.year(); m=now.month(); d=now.day();hour_clock=now.hour(); minute_clock=now.minute(); secand_clock=now.second();sprintf(buf,"%04d%02d%02d%02d%02d%02d\n",y,m,d,hour_clock,minute_clock,secand_clock);Serial.println(buf);}delay(1000);}//---------------------------------<수신측>bool flag=0;int h=0,m=0,s=0;//void loop(){if(flag==0){ flag=1;if(mySerial.available()){byte r=mySerial.read();//s=m; m=h; h=r; // 자리이동//if(r>=100){ secand_clock=s; minute_clock=m; hour_clock=(h-100)*5; flag=1; } // 시간 수신하면}}}
이 소스도 참고하세요
초부터 전송하고 시를 나중에 보냅니다.
시를 보낼 때에는 100을 더해서 100~123을 전송하는데
수신에서 100 이상의 값이면 시로 간주해서 전송을 마감합니다.
댓글 4
조회수 6,252hktsakura님의 댓글
hktsakura 작성일
if(r1==){ mySerial.end(); }
if(r2==){ mySerial.end(); }
if(r3==){ mySerial.end(); }
이 부분은 r1,r2,r3에 문자가 수신되면 mySerial.end()가 실행되는 의미로 썼는데 지워도 되나여??
master님의 댓글
master
답글 아랫쪽에 소스를 추가했으니 참고하세요
hktsakura님의 댓글
hktsakura 작성일
수신측의 코드 중 byte r=mySerial.read(); 이걸로 해봤는데 수신이 안되는거 같아서...
지금 사용하고있는 코드인
r1=(byte)mySerial.read();
r2=(byte)mySerial.read();
r3=(byte)mySerial.read();에서
r1,r2,r3는 byte로 선언했고 hour_clock, minute_clock, secand_clock은 unsigned long으로 선언했습니다.
master님의 댓글
master
if(mySerial.available()){
byte r=mySerial.read();
Serial.write(r); Serial.print("="); Serial.println(r);
}
다른 코드 제외하고
블루투스에서 어떤 값을 받는지 시리얼모니터로 출력해서 체크해보세요