NAVER

질문 아두이노 Serial.read() 와 Serial.readString() 에 대한 질문
0x**** 조회수 1,741 작성일2018.08.31

Xbee 송수신 모듈을 이용하여 통신 해보려 합니다.


<<<송신>>>


void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  int WTLS = digitalRead(2);
 
  Serial.print("Waterbox0 = ");
  Serial.println(WTLS);

  if (WTLS == HIGH) {
    digitalWrite(13,LOW);
  }
  else{
    digitalWrite(13,HIGH);
  }
}


<<<수신>>>


void setup() {
  Serial.begin(9600);
  Serial.setTimeout(20);
  pinMode(13, OUTPUT);
}


void loop() {:
 
    String adress;
    int Water;
    adress = Serial.readString();
    Water = Serial.read();
    if (adress == "Waterbox0")
    {
      if (Water == '0') {
        digitalWrite(13, HIGH);
        Serial.println("YES");
      }
      else if (Water == '1') {
        digitalWrite(13, LOW);
        Serial.println("NO");
      }
    }
    else if (adress == "Waterbox1")
    {
      digitalWrite(12, HIGH);
    }
}



Serial.read() 만 사용 하였을때는 서로 통신 이 잘되었는데

Serial.readString() 을 통해 어떤 송신기에서 온 측정값인지 알고싶어, 사용해 보았습니다.

readString() 과 read()를 같이 사용하니 통신이 되지않았습니다.

readString()과 read() 는 두가지 다 사용할 수는 없는 것인가요 ?

아니면 다른 잘못된 부분이 있는것인가요 ?

아두이노를 배우고 있는 입장에서 독학하려니 너무 어렵습니다.

부디 선처해주셔서 좋은 답변 해주시면 감사하겠습니다.

프로필 사진

답변자님,

정보를 공유해 주세요.

1 개 답변
1번째 답변
프로필 사진
키트 박옥현
우주신
전기, 전자 공학 6위, 프로그래머 1위, 프로그래밍 22위 분야에서 활동
본인 입력 포함 정보


// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-08-31 오후 9:40:56
// by Ok-Hyun Park
//
//--------------------<<<송신>>>
void setup(){
  Serial.begin(9600);
  pinMode(2,INPUT); pinMode(13,OUTPUT);
}
//
void loop(){
  int WTLS=digitalRead(2);
  Serial.write('0');  // 문자
  Serial.write(WTLS); // 정수
  if(WTLS==HIGH){ digitalWrite(13,LOW ); }
  else          { digitalWrite(13,HIGH); }
  delay(100);
}
//
//--------------------<<<수신>>>
void setup(){
  Serial.begin(9600);
  Serial.setTimeout(20);
  pinMode(13,OUTPUT);
}
//
void loop(){
  char r,adress,Water;
  r=Serial.read();
  if(r=='0'){          // 어드레스가 '0'이면
    r=Serial.read();
    if(r==0){ digitalWrite(13,HIGH); Serial.println("YES"); }  
    if(r==1){ digitalWrite(13,LOW ); Serial.println("NO "); }
  }
  else if(r=='1'){     // 어드레스가 '1'이면
    r=Serial.read();
    if(r==0){ digitalWrite(12,HIGH); Serial.println("YES"); }
    if(r==1){ digitalWrite(12,LOW ); Serial.println("NO "); }
  }
}


어드레스를 문자영역으로 전송하고

입력값을 정수로 전송하면 

수신에서 구분해서 받기에 좋습니다.

//

더 간단한 방법은

0x00, 0x01 <-- 보드1 의 입력값

0x10, 0x11 <-- 보드2 의 입력값

0x20, 0x21 <-- 보드3 의 입력값

0x30, 0x31 <-- 보드4 의 입력값

0x40, 0x41 <-- 보드5 의 입력값

0x50, 0x51 <-- 보드6 의 입력값

이런식으로 전송해도 됩니다.

입력값은 HIGH,LOW 2 종류 밖에 안되므로
최대 128 어드레스까지 사용할 수 있습니다.


// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-08-31 오후 9:51:23
// by Ok-Hyun Park
//
//--------------------<<<송신>>>
int add=0; // 어드레스 0
int WTLS,send;
//
void setup(){
  Serial.begin(9600);
  pinMode(2,INPUT); pinMode(13,OUTPUT);
}
//
void loop(){
  int WTLS=digitalRead(2);
  //
  if(WTLS){ digitalWrite(13,LOW ); }
  else    { digitalWrite(13,HIGH); }
  //
  send=(add<<1)|WTLS; // add:비트1~비트7, WTLS:비트0
  Serial.write(send);
  //
  delay(100);
}
//
//--------------------<<<수신>>>
//
void setup(){
  Serial.begin(9600);
  Serial.setTimeout(20);
  pinMode(13,OUTPUT);
}
//
void loop(){
  char r,adress,Water;
  r=Serial.read();
  if((r>>1)==0){                                  // 어드레스가 '0'이면
    if(r&1){ digitalWrite(13,HIGH); Serial.println("YES"); } // 비트0=1  
    else   { digitalWrite(13,LOW ); Serial.println("NO "); } // 비트0=1
  }
}


이런식이 되는거죠



추가문의는  https://www.basic4mcu.com



2018.08.31.

  • 채택

    질문자가 채택한 답변입니다.

이 답변의 추가 Q&A
질문자와 답변자가 추가로 묻고 답하며 지식을 공유할 수 있습니다.
도움이 되었다면 UP 눌러주세요!
UP이 많은 답변일수록 사용자들에게 더 많이 노출됩니다.