아두이노 강좌 #5 시리얼 통신 2. UART 초기화 및 송신 프로그래밍
Lucy Archive
Lucy 2023
2020. 7. 4. 00:05
Arduino Serial Output UART TX

아두이노 시리얼(UART) 통신 출력

  지난 포스트에서는 아두이노의 시리얼 통신이 무엇인지 알아보고, 간단히 아두이노 -> PC 로 문자열을 출력 하는 방법에 대해 알아보았습니다. 본 포스트에서는 

아두이노 시리얼 통신 초기화 하는 방법과 출력 송신하는 방법

에 대해 알아보겠습니다.  

시리얼 통신 출력 프로그램 작성 방법

아두이노에서 시리얼 통신 프로그래밍을 하기 위해서 아래의 순서로 진행 진행됩니다.

  • void setup() 함수 내
    • 시리얼통신 초기화 : Serial.begin()
      • 시리얼 통신 포트 사용 선언
      • 통신 속도 결정
      • 데이터 프레임 결정
    • (옵션)초기화 출력 코드 작성
  • void loop() 함수 내
    • 사용 하는 프로그램 시리얼 출력 함수를 사용
    • Serial.print() - 문자열 출력
    • Serial.println() - 문자열을 끝에 줄바꿈(개행문자) 추가하여 출력
    • Serial.write() - 바이트 단위 데이터 출력

시리얼통신 프로그램 예시시리얼통신 프로그램 예시 <3초마다 로또 번호 추출기>

주요 함수 : 시리얼 초기화, 출력

Serial.begin()

Syntax

  • Serial.begin(speed) : 주로 사용 됩니다.
  • Serial.begin(speed, config)

Parameter

  • speed : 통신 속도(buadrate)를 입력 입니다. - 9600 19200 115200 128000 등
  • config
    • [각주:1]데이터 프레임을 결정 합니다. - 데이터 크기, 페리티, 정지비트
    • 생략 된 경우 : Data 8bit, Parity 없음, Stop 1bit

Return : 없음

Example

  • Serial.begin(9600) : UART 1번 채널을 활성화 하고, 속도를 9600, Parity 없음
  • Serial.begin(9600, SERIAL_8E1) : UART 1번 채널 활성화, 속도 9600, Even Parity 적용

[각주:2]Serial 통신을 여러 개 사용할 수 있는 보드에서는 Serial1.begin(9600) , Serial2.begin(9600) 등으로 'Serial + 채널번호' 와 같이 Serial Class 가 정의되어 있습니다. 


Serial.print() / Serial.println()

Syntax

  • Serial.print(val)
  • Serial.print(val, format)

Parameters

  • val : 출력할 데이터 - 모든 데이터 타입 사용 가능
  • [각주:3]format : 정수를 출력할 경우 진법 옵션, 실수(소수) 출력하는 경우 소수점 자리 수
    • BIN : 2진수로 출력
    • OCT : 8진수로 출력
    • DEC : (Default)
    • HEX : 16진수로 출력
    • Number : 실수 출력하는 경우 소수 점 자리 수 - Default 소수점 2자리 까지

Returns : 출력한 데이터의 크기를 비트 단위로 반환

Example

  • Serial.print("Hello world!") : "Hello world!" 문자열을 출력
  • Serial.print(65) : 숫자 65를 문자열 "65" 로 출력
  • Serial.print(65, HEX) : 숫자 65를 16진수 "41"(0x41)로 출력
  • Serial.print(3.141592) : 실수 3.141592 를 소수점 2자리 "3.14"를 출력
  • Serial.print(3.141592, 4) : 실수 3.141592 를 소수점 4자리 "3.1415"를 출력

Serial.println() 은 Serial.print() 와 사용법은 동일하고, Serial.print() 의 출력에 개행(줄바꿈)이 추가되어 출력 됩니다. 

Serial.write()

Syntax

  • Serial.write(val)
  • Serial.write(str)
  • Serial.write(buf, len)

Parameters

  • val : 8bit 크기의 데이터
  • str : 문자열 - "Hello" 와 같이 사용 가능
  • buf : 배열
  • len : 전송할 배열의 크기

Returns : 출력한 데이터의 크기를 비트 단위로 반환

Example

  • Serial.write("Hello world!") : "Hello world!" 문자열을 출력
  • Serial.write(65) : [각주:4]ASCII 코드 65의 값 'A'를 출력
  • Serial.write(buff, 4) : buff 배열의 0 ~ 3번째 데이터를 출력


시리얼 통신 예제

시리얼 통신 초기화 : begin()

시리얼 포트를 0으로 초기화 하고, "Serial Port Connected!" 문자열을 1회 출력 합니다.

1
2
3
4
5
6
7
8
// #1 Serial Port Init..
void setup(){
    Serial.begin(9600);
    Serial.println("Serial Port Connected!"); 
}
 
void loop(){
}
cs

시리얼 통신 초기화 예제 결과시리얼 통신 초기화 예제 결과


문자열 출력 : print()/println()

Serial.print()Serial.println() 은 옵션 파라미터를 테스트 하는 예제 이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void setup(){
    Serial.begin(9600);
    delay(1000);
    Serial.println("Serial Port Connected!");
    delay(1000);
    Serial.println("Serial.Print test program start..");
    Serial.println("");
    delay(1000);
}
 
void loop(){
    int iNum = 16;
    float fNum = 3.141592;
    
    Serial.println("Serial.print(3.141592, Option); Float Output Test..");
 
    Serial.print("- Option : None -> "); 
    Serial.println(fNum);    // 실수형인 경우 소수점 2자리
    Serial.print("- Option : 0 -> "); 
    Serial.println(fNum, 0); // 정수
    Serial.print("- Option : 2 -> "); 
    Serial.println(fNum, 2); // 소수점 2자리
    Serial.print("- Option : 4 -> "); 
    Serial.println(fNum, 4); // 소수점 4자리
    Serial.println("");
 
    Serial.println("Serial.print(16, Option); Number Notation Test..");
    Serial.print("- Option : None -> ");
    Serial.println(iNum);         // 10진수 출력    
    Serial.print("- Option : BIN -> ");
    Serial.print("0b");
    Serial.println(iNum, BIN);    // 2진수로 출력
    Serial.print("- Option : OCT -> ");
    Serial.print("0o");
    Serial.println(iNum, OCT);    // 8진수로 출력
    Serial.print("- Option : DEC -> ");
    Serial.println(iNum, DEC);    // 10진수로 출력
    Serial.print("- Option : HEX -> ");
    Serial.print("0x");
    Serial.println(iNum, HEX);    // 16진수로 출력
 
    while(1){;}
}
cs

코드 마지막 줄의 while(1){;} 는 프로그램이 Loop() 함수 내의 코드가 한번만 실행되기 위해 추가하였다.

문자열 예제 출력 결과문자열 예제 출력 결과

바이트 데이터로 출력 : write()

바이트 단위의 데이터 출력 함 수 Serial.write() 를 테스트 하는 예제 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void setup(){
    Serial.begin(9600);
    Serial.println("Serial Port Connected!");
    delay(1000);
    Serial.println("Serial.write() test program start..");
    Serial.println("");
    delay(1000);
}
 
void loop(){
    int iNum = 65;
    byte byteArrayNum[8= {65666768697080}; // ascii A, B, C, D, E, F, G
 
    Serial.println("iNum = 65");
    Serial.println("byteArrayNum[8] = {65, 66, 67, 68, 69, 70, 80}");
    Serial.print("- Serial.write(iNum) : ");
    Serial.write(iNum); // 숫자 65 를 ascii 65 번값 'A' 출력
    Serial.write('\n'); // 줄바꿈 출력
    Serial.print("- Serial.write(\"ABCDE\") : ");
    Serial.write("ABCDE"); // 문자열 "ABCDE" 출력
    Serial.write('\n'); // 줄바꿈 출력
    Serial.print("- Serial.write(byteArrayNum, 5) : ");
    Serial.write(byteArrayNum, 5); // byteArrayNum 의 5개 데이터 출력, 65~69 의 Ascii 값 출력 "ABCDE"
    Serial.write('\n');
 
    while(1){;};
}
cs

바이트 출력 예제 결과바이트 출력 예제 결과

print() vs write() 차이점 비교

print() 함수와 write() 함수의 차이를 확인하기 위한 예제이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void setup(){
    Serial.begin(9600);
    delay(1000);
    Serial.println("Serial Port Connected!");
    delay(1000);
    Serial.println("Serial.print() vs write() test program start..");
    Serial.println("");
    delay(1000);
}
 
void loop(){
    int iNum = 64;
    
    Serial.println("Number value Output Compare");
    Serial.print("Serial.print(64) : ");
    Serial.print(64); // print() : 64를 문자열 "64" 로 출력
    Serial.println();
    Serial.print("Serial.write(64) : ");
    Serial.write(64); // wrtie() : ascii '64'번 값을 출력 -> A
    Serial.println(); 
    Serial.println();
 
    Serial.println("String Output Compare");
    Serial.print("Serial.println(\"hello\") : ");
    Serial.println("hello");    
    Serial.print("Serial.write(\"hello\\n\") : ");
    Serial.write("hello\n"); // write() 문자열 출력시 개행(줄바꿈)은 수동으로 입력
 
    while(1){;}
}
cs

※ Tips : Serial.print()/println()/write() 에서 특수기호 \ 와 " 를 출력하고 싶은 경우 문자 앞에 \를 추가

print(), write() 비교 예제 결과print(), write() 비교 예제 결과

숫자를 출력하는 경우 

  • Serial.println(64) :  숫자를 그대로 문자열 "64"로 출력
  • Serial.write(64) : 함수는 "64"의 ASCII 코드 값으로 출력

문자열 출력하는 경우 Serial.write() 함수는 Serial.println() 와 같이 개행(줄바꿈) 자동 삽입 기능이 없으므로, 줄 바꿈을 해야 하는 경우 문자 \n 를 추가해야 한다.


마무리

  이번 포스트에서는 UART 초기화 및 데이터 송신하는 함수에 대해 알아 보았습니다. 다음 포스트에서는 UART 수신에 대해 작성할 예정입니다.

  끝까지 읽어주셔서 감사합니다.^^

관련포스트

👉 아두이노 시리얼통신 관련글 목록 보기

👉 아두이노 전체 포스트 목록 보기 


  1. Serial DataFrame 참조 : https://www.arduino.cc/reference/en/language/functions/communication/serial/begin/ [본문으로]
  2. 다수의 시리얼 포트가 있는 경우 참조 : https://www.arduino.cc/reference/en/language/functions/communication/serial/ [본문으로]
  3. Serial.print() 옵션 참조 : https://www.arduino.cc/reference/en/language/functions/communication/serial/print/ [본문으로]
  4. ASCII 테이블 참조 : https://ko.wikipedia.org/wiki/ASCII [본문으로]