BASIC4MCU | 질문게시판 | 아두이노 시리얼통신에 관하여
페이지 정보
작성자 뚤밥 작성일2021-08-03 17:27 조회2,229회 댓글1건본문
항상 정말정말 도움이 많이 되고 있습니다 정말감사합니다
저의 질문은 아두이노메가에서 nodemcu랑 하드웨어시리얼통신을 할떄 변수들이 초기화가 안되는 문제입니다
코드를 보여드리자면
메가에서는 이런식으로 아래와 같이 센서값들을 write 해줍니다
Serial3.write('#');// 시작문자
Serial3.write(dust_25_out/10);
Serial3.write(dust_25_out%10);
Serial3.write(dust_10_out/10);
Serial3.write(dust_10_out%10);
Serial3.write(flat_10/10); //2
Serial3.write(flat_10%10); //5
Serial3.write(flat_01/10); //1
Serial3.write(flat_01%10); //4
Serial3.write(flon_10/10); //3
Serial3.write(flon_10%10); //4
Serial3.write(flon_01/10); //5
Serial3.write(flon_01%10); //6
Serial3.write(rain/1000);
Serial3.write(rain/100%10);
Serial3.write(rain/10%10);
Serial3.write(rain%10);
Serial3.write('$'); // 종료문자
///////////////////////
nodemcu에서는 받을때 아래와같이 센서값들을 read 해줍니다
if(mySerial.available()){
char r=mySerial.read();
if(r=='#'){ inddex=0; } // 시작문자면 인덱스 초기화
else if(r=='$'){ // 종료문자
if(inddex==16){ // 4바이트 길이 체크
opm25=buf[0]*10+buf[1]; //2.5
opm10=buf[2]*10+buf[3]; //10
val3=buf[4]*10+buf[5]+buf[6]/10+buf[7]/100; //위도 ex) 63.11
val4=buf[8]*10+buf[9]+buf[10]/10+buf[11]/100; //경도 ex) 12.43
rain=buf[12]*1000+buf[13]*100+buf[14]*10+buf[15]; //비
delay(100);
}
inddex=0;
}
else{ // 시작문자와 종료문자 사이의 데이터 수신
if(inddex<18){buf[inddex++]=r;}
}
}
Serial.print("node mcu 에서의 미세먼지값 ");
Serial.print(opm25);
Serial.print(" 그리고 ");
Serial.println(opm10);
if (Firebase.ready()){
Serial.printf("Set Int... %s\n", Firebase.setInt(fbdo, "/out/PM25", opm25) ? "ok" : fbdo.errorReason().c_str());
Serial.printf("Set Int... %s\n", Firebase.setInt(fbdo, "/out/PM10", opm10) ? "ok" : fbdo.errorReason().c_str());
Serial.printf("Set double... %s\n", Firebase.setFloat(fbdo, "/out/latitude", val3) ? "ok" : fbdo.errorReason().c_str());
Serial.printf("Set double... %s\n", Firebase.setFloat(fbdo, "/out/longitude",val4) ? "ok" : fbdo.errorReason().c_str());
///////////////////////뒤에 추가로 파이어베이스에 쓰고 가져오고 하는 코드가 있지만 생략하였습니다
문제는 여기서 발생합니다 사진을 첨부해드리겠습니다
사진과같이 메가에서는 실시간으로 센서를 write해주는데
nodemcu에서는 실시간으로 바로 읽지않고 처음 값을 받는데도 30~40초 걸리고 뿐만아니라 값들이 30초~40초마다 한번 바뀝니다
제 예상으로는 nodemcu코드에서는 if(r=='#'){ inddex=0; } 이부분에서 write는 #이아닌 다른것을 쓰고있어서 이프문을 거치지 않고 지나가는것 같습니다
코드를 어떻게 고쳐야하나요 ??
댓글 1
조회수 2,229master님의 댓글
master 작성일
if(r=='#'){ inddex=0; } // 시작문자면 인덱스 초기화
else if(r=='$'){ // 종료문자
첫문자로 '#'을 사용하고, 마지막문자로 '$'를 사용하세요
데이터는 모두 16개를 정확히 사용해야 합니다.
'#' + 데이터16문자 + '$'
18문자를 정확하게 전송하세요