-
시리얼 통신 기초Arduino/Serial 통신 2020. 10. 19. 18:28
나중에 자바와 시리얼 통신을 할 것이므로 이 부분은 중요하다.
Serial(직렬)통신은 연속적으로 통신 채널이나 컴퓨터 버스를 거쳐 한 번에 하나의 비트 단위로 데이터를 전송하는 과정
Arduino에서 시리얼 통신하는 방법
setup함수에서 Serial.begin(9600)을 호출한다.
Serial.begin함수에서는 초당 전송할 비트수 정의한다.
이 숫자가 클수록 많이 보낸다. 근데 불안정하다.
Serial.println함수 혹은 Serial.write함수를 사용하여 '시리얼 모니터'에 출력한다.
Serial.read함수를 사용하여 시리얼로 들어오는 1Byte 내용을 입력한다.
Serial.read함수는 입력되는 값을 바이트 단위로 읽는다.
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: Serial.println(Serial.read()); delay(1000); }
그리고 위의 소스 코드를 실행해서 '시리얼 모니터' 로 보자.
'시리얼 모니터' 하단에 다음과 같은 목록이 보일 것이다.
각 목록들을 하나씩 선택하고 나서 serial창에 한 문자씩 입력해보자.
각 목록에 따라 다음과 같은 Serial.read함수의 결과를 알 수 있다.
line ending 없음 : 반환 값 없음
새 줄(New Line) : 10
캐리지 리턴(Carriage return) : 13
입력이 없을 경우 255 혹은 -1
시리얼 입출력은 8비트로 전송( idle 상태 11111111 전송되므로 255를 출력한다. )
아두이노와 PC간의 통신 방향
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: byte var = Serial.read(); // PC에서 아두이노 방향의 데이터 Serial.println(var)); // 아두이노에서 PC 방향의 데이터 delay(1000); }
입력된 값을 문자로 표현하는 방법
입력된 값을 문자로 표현하기 위해서는 char형으로 강제 형 변환을 해야 한다.
소스 코드
// 입력된 값을 문자로 표현하기 위해서는 (char)강제 형 변환을 해야 한다. void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: byte var = Serial.read(); // PC에서 아두이노 방향의 데이터 Serial.println((char)var); // 아두이노에서 PC 방향의 데이터 delay(1000); }
Serial.println함수와 Serial.write함수의 차이
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: Serial.println(10); // println함수는 2바이트, write함수는 1바이트 delay(100); }
시리얼 모니터의 출력 결과
시리얼 통신(한 문자로 LED제어)
다음과 같이 연결해보자. LED는 3번 핀으로 쓸 것이다.
저항은 220옴을 쓴다.
소스 코드
#define LED_PIN 3 // LED로 쓸 핀 번호 void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: if (Serial.available()) { char var = (char)Serial.read(); if (var == '0') { digitalWrite(LED_PIN,LOW);} else if (var == '1'){ digitalWrite(LED_PIN,HIGH);} } delay(1000); }
시리얼 통신이 유효할 때만 통신하기
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: int var = Serial.available(); Serial.println(var); delay(1000); }
코드를 실행하면 키보드 값을 입력할 때마다 값이 증가하는 것을 볼 수 있다.
시리얼 통신 창에서 하단에 아래와 같은 목록이 있다.
위의 목록들 중에서 다른 것으로 선택하고 나서 값을 입력하면 값이 2혹은 3씩 증가하는 것을 볼 수 있다.
아래에서 이 Serial.available함수에 대해 알아보자.
Serial.available 함수
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: int var = Serial.available(); Serial.println(var); int var1 = Serial.read(); delay(1000); }
Serial.available함수는 현재 버퍼에 쌓여 있는 숫자를 읽어 출력한다.
Serial.read함수가 호출되는 순간 한 개의 값이 빠져나가므로 버퍼의 값은 1이 감소하게 된다.
Serial.available함수를 이용하면 버퍼 안에 내용이 있을 때까지 읽어 올 수 있다.
Serial.available함수는 버퍼에 쌓여 있는 개수를 리턴한다.
Serial.available()함수를 이용하면 8개의 데이터를 가지고 올 때 유용하게 처리할 수 있다.
Serial.available()함수의 리턴값이 8일 때, 8번 반복해서 데이터를 쉽게 얻을 수 있다.Serial.read함수
소스 코드
void setup() { // put your setup code here, to run once: Serial.begin(9600); // 바운드 레이트 정의 } void loop() { // put your main code here, to run repeatedly: if (Serial.read() > 0) Serial.println("print"); delay(1000); }
Serial.read함수는 버퍼에서 하나씩 빼는 함수이다.
위에서 주의할 점은 시리얼 창에서 'line ending 없음'으로 변경하고 실행해야 한다.
'Arduino > Serial 통신' 카테고리의 다른 글
아두이노와 아두이노의 시리얼 통신하기 (0) 2020.11.05 Serial Rx Tx & SoftwareSerial Rx Tx (0) 2020.10.20 시리얼 통신에 사용되는 함수 (0) 2020.10.20 시리얼 통신과 문자열 활용 - LED (0) 2020.10.20 시리얼 통신의 활용 - LED와 센서 (0) 2020.10.19