코딩교육-아두이노

아두이노 스케치 시작 (PC 시리얼 통신) - Arduino Serial Communication - PuTTY

carrotweb 2022. 1. 9. 18:59
728x90
반응형

개발 후 환경에 따라 연동 프로그램이 아닌 일반 터미널 클라이언트를 사용해야 하는 상황이 있을 수 있습니다. 그래서 터미널 클라이언트인 PuTTY(퍼티)를 사용하여 아두이노 보드와 시리얼 통신을 해보겠습니다.

PuTTY(퍼티)로 시리얼 통신 연결하기

PuTTY(퍼티)가 설치되어 있지 않으면 아래의 PuTTY 설치하기를 참조하여 설치하기시 바랍니다.

1. PuTTY를 실행합니다.

 

2. Connection Type에서 Serial를 선택하고 아두이노 보드와 연결된 시리얼 포트 명을 Serial line에 입력하고 Speed에 시리얼 통신 속도를 입력합니다. 기본적으로 Serial line에 COM1이 Speed에는 9600으로 되어있습니다. 저는 시리얼 포트가 COM3이고 Baud Rate(보드 레이트)가 9600으로 설정되어있습니다. 그리고 Open 버튼을 눌러 연결합니다.

 

3. 콘솔이 열리면서 연결된 아두이노 보드와 시리얼 통신으로 연결되고 출력됩니다.

 

연결된 아두이노 보드에 업로드된 소스는 다음과 같습니다.

void setup() {
  Serial.begin(9600);
  while (!Serial) {
  }
  Serial.println("Serial Port Connected.");
}

void loop() {
  Serial.println("이름을 입력하세요.");
  while(Serial.available() == 0) {
  }
  String name = Serial.readStringUntil('\n');
  Serial.println(name + "님, 안녕하세요.");
}

 

영어, 숫자, 기호는 정상적으로 처리되기 때문에 한글로 입력하여 테스트하였습니다.

4. 콘솔에 "홍길동"을 여러번 입력합니다. 그러나 입력 중에 출력되거나 출력이 정상적으로 나오지 않는 현상이 발생합니다. 처음부터 출력이 나오지 않는 경우도 있습니다.

시리얼 모니터에서는 입력란에 입력 후 전송하기 때문에 입력 데이터가 한번에 전송이 되지만 PuTTY와 같은 터미널 클라이언트는 입력 즉시(한글은 한글자가 완성되는 시점) 전송됩니다. 그 이유는 아두이노 보드의 시리얼 통신에서 시리얼 타임아웃으로 인해 입력 중에도 Serial.readString()함수나 Serial.readStringUntil()함수가 처리됩니다.

 

그래서 입력 데이터가 한글인 경우에는 시리얼 타임아웃 시간안에 입력이 되지 않으면 중간에 완성된 문자들만 처리되거나 입력된 문자들이 깨져서 빈문자로 처리됩니다. 시리얼 타임아웃은 한글이나 영어나 동일하여 영향이 있습니다.

그래서 소스에 시리얼 타임아웃 시간을 1초에서 5초로 변경하여 설정하였습니다.

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(5000); // 시리얼 타임아웃 설정 추가
  while (!Serial) {
  }
  Serial.println("Serial Port Connected.");
}

void loop() {
  Serial.println("이름을 입력하세요.");
  while(Serial.available() == 0) {
  }
  String name = Serial.readStringUntil('\n');
  Serial.println(name + "님, 안녕하세요.");
}

 

그리고 연결된 아두이노 보드에 업로드하고 다시 콘솔에 "홍길동"을 입력합니다. 입력 후 5초가 지나 출력되나 정상적으로 나오지 않습니다.

 

그래서 종료 문자로 지정한 Line Feed('\n')문자를 "홍길동"입력 다음에 바로 입력하였습니다.

콘솔에서는 Line Feed('\n')문자를 입력하기 위해서는 Ctrl + J를 누르면 됩니다. '\n'를 입력하면 문자로만 인식됩니다.

 

정상적으로 입력한 "홍길동"이 출력됩니다. 그 이유는 종료 문자 후 즉시 입력된 문자들을 String으로 변환하여 가져오기 때문에 한글이 깨지 않고 변환되어 출력됩니다.

그러나 매번 입력 후 Ctrl + J를 눌러야 하는 불편함이 생깁니다. 그리고 시리얼 타임아웃 시간 안에 한영키를 번갈아 가면서 입력하기가 쉽지 않습니다.

그럼, 콘솔에서 어떻게 해야 할까요?

콘솔에서는 엔터를 누르면 Carriage Return('\r')이 전송됩니다.

그래서 소스에 종료 문자를 '\n'에서 '\r'로 변경합니다.

참고로, 콘솔에서는 Carriage Return('\r')문자를 입력하기 위해서는 Ctrl + M를 누르면 됩니다.

void loop() {
  Serial.println("이름을 입력하세요.");
  while(Serial.available() == 0) {
  }
  String name = Serial.readStringUntil('\r'); // Carriage Return으로 변경
  Serial.println(name + "님, 안녕하세요.");
}

 

그리고 연결된 아두이노 보드에 업로드하고 다시 콘솔에 "홍길동"을 입력하면 바로 정상적으로 출력됩니다.

시리얼 타임아웃 시간은 개발 후 환경에 따라 적절하게 설정하시기 바랍니다.

시리얼 모니터에서는 하단에서 첫번째 셀렉트 옵션을 "캐리지 리턴"으로 선택하시 됩니다.

 

만약, "Both NL & CR"를 선택하면 입력 데이터 뒤에 Carriage Return('\r')과 Line Feed('\n')이 추가하여 전송됩니다. 그래서 Carriage Return('\r')문자 이후 Line Feed('\n')문자는 공백으로 처리됩니다.

 

프로그램이 아닌 터미널 프로그램으로 시리얼 통신을 할 경우 입력/출력 데이터로 대량의 한글을 사용할 때는 환경을 중분히 고려하여 개발하시기 바랍니다.

 

PuTTY란

PuTTY는 Windows 플랫폼용으로 Simon Tatham(사이먼 테이썸)이 개발한 SSH 및 텔넷 클라이언트(터미널 에뮬레이터)입니다. PuTTY는 오픈 소스 소프트웨어입니다.

PuTTY란 이름은 특별한 뜻이 없으며 유닉스 전통의 터미널인 teletype를 짧게 줄인 TTY에 Pu을 붙인 것입니다.

PuTTY 설치하기

1. PuTTY(퍼티) 사이트(https://www.putty.org/)에 접속합니다. 다운로드를 위해 "here"를 클릭합니다.

 

2. 다운로드 페이지에서 MSI ("Windows Installer")의 64-bit x86인 "putty-64bit-0.76-installer.msi"를 클릭합니다. 클릭하면 웹브라우저에서는 다운로드가 진행됩니다.

 

3. 다운로드 받은 파일(putty-64bit-0.76-installer.msi)을 클릭하여 실행시킵니다.

 

4. PuTTY 설치 프로그램이 실행됩니다. "Next"버튼을 클릭합니다.

 

5. 설치 경로를 설정합니다. 변경하시려면 "Change..."버튼을 클릭합니다. 그렇지 않으면 "Next"버튼을 클릭합니다.

 

6. 설치할 제품 기능들을 선택합니다. "Install"버튼을 클릭합니다.

 

7. 설치가 완료됩니다. "Finish"버튼을 클릭하여 종료합니다.

728x90
반응형