본문 바로가기
HW 프로그래밍/아두이노

소프트웨어 시리얼 2개 이상 사용하기

by N2info 2022. 10. 5.

SoftwareSerial 이란?

 

아두이노에서는 0번핀과 1번핀을 기본적으로 하드웨어 시리얼로 사용하고 있습니다.

 

하지만 블루투스 모듈이나, UART(*시리얼)통신을 사용하는 모듈을 사용할때 소프트웨어적으로 일반 I/O 핀들을 시리얼 통신을 하는데 사용할 수 있도록 해줍니다.

 

그런데 문제가 하나 있습니다.

 

아두이노에서 softwareSerial을 사용할때, 2개 이상을 선언해서 사용하면 일반적으로는 사용할 수 없는 것입니다.

 #include <SoftwareSerial.h>

SoftwareSerial bluetooth1(2,3);
SoftwareSerial bluetooth2(4,5);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  bluetooth1.begin(9600);
  bluetooth2.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  while(bluetooth1.available()){
    Serial.write(bluetooth1.read());
  }
  while(bluetooth2.available()){
    Serial.write(bluetooth2.read());
  }
}

이렇게 블루투스모듈을 2개를 달아 SoftwareSerial을 두개를 연결하여 각 블루투스의 값을 수신하도록  있도록 하는것입니다.

그러나, 이렇게 동작을 할경우 아무리 회로를 맞게해도 정상적으로 동작을 하지 않습니다.

이럴때 SoftwareSerial :: listen(); 을 사용하시면 됩니다.

listen();은 해당 소프트웨어 시리얼에서 수신을 시작하겠다는 선언입니다.

 

즉 위의 코드를 다음과 같이 수정하시면 됩니다.

 #include <SoftwareSerial.h>

SoftwareSerial bluetooth1(2,3);
SoftwareSerial bluetooth2(4,5);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  bluetooth1.begin(9600);
  bluetooth2.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  bluetooth1.listen();
  while(bluetooth1.available()){
    Serial.write(bluetooth1.read());
  }
  bluetooth2.listen();
  while(bluetooth2.available()){
    Serial.write(bluetooth2.read());
  }
}

이상은 DIY 메카솔루션 오픈랩 의 글입니다.

 

그런데...

하나는 송수신(1)을 하고, 나머지 하나는 송신(2)만 하는 경우

위의 방법을 사용해도 송수신(1)  의 결과를 읽어오지 못하는 경우가 있더라

이때는 송신만 하는 송신(2)  에는 listen()을 사용하지 않으니 되더라...