아두이노 시리얼(UART) 통신 출력
아두이노 시리얼 통신 초기화 하는 방법과 출력 송신하는 방법
에 대해 알아보겠습니다.시리얼 통신 출력 프로그램 작성 방법
아두이노에서 시리얼 통신 프로그래밍을 하기 위해서 아래의 순서로 진행 진행됩니다.
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
Return : 없음
Example
- Serial.begin(9600) : UART 1번 채널을 활성화 하고, 속도를 9600, Parity 없음
- Serial.begin(9600, SERIAL_8E1) : UART 1번 채널 활성화, 속도 9600, Even Parity 적용
Serial 통신을 여러 개 사용할 수 있는 보드에서는 Serial1.begin(9600) , Serial2.begin(9600) 등으로 'Serial + 채널번호' 와 같이 Serial Class 가 정의되어 있습니다. 2
Serial.print() / Serial.println()
Syntax
- Serial.print(val)
- Serial.print(val, format)
Parameters
- val : 출력할 데이터 - 모든 데이터 타입 사용 가능
- format : 정수를 출력할 경우 진법 옵션, 실수(소수) 출력하는 경우 소수점 자리 수 3
- 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) : ASCII 코드 65의 값 'A'를 출력 4
- 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] = {65, 66, 67, 68, 69, 70, 80}; // 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() 비교 예제 결과
숫자를 출력하는 경우
Serial.println(64): 숫자를 그대로 문자열 "64"로 출력Serial.write(64): 함수는 "64"의 ASCII 코드 값으로 출력
문자열 출력하는 경우 Serial.write() 함수는 Serial.println() 와 같이 개행(줄바꿈) 자동 삽입 기능이 없으므로, 줄 바꿈을 해야 하는 경우 문자 \n 를 추가해야 한다.
마무리
이번 포스트에서는 UART 초기화 및 데이터 송신하는 함수에 대해 알아 보았습니다. 다음 포스트에서는 UART 수신에 대해 작성할 예정입니다.
끝까지 읽어주셔서 감사합니다.^^
- Serial DataFrame 참조 : https://www.arduino.cc/reference/en/language/functions/communication/serial/begin/ [본문으로]
- 다수의 시리얼 포트가 있는 경우 참조 : https://www.arduino.cc/reference/en/language/functions/communication/serial/ [본문으로]
- Serial.print() 옵션 참조 : https://www.arduino.cc/reference/en/language/functions/communication/serial/print/ [본문으로]
- ASCII 테이블 참조 : https://ko.wikipedia.org/wiki/ASCII [본문으로]
'Embedded > Arduino' 카테고리의 다른 글
아두이노 강좌 #7 프로그래밍 기초 - 데이터 타입, 변수, 상수, 선언자 (0) | 2020.07.06 |
---|---|
아두이노 강좌 #6 시리얼 통신 3. UART 수신 프로그래밍 (1) | 2020.07.05 |
아두이노 강좌 #4 시리얼 통신 1. 개요 및 Hello World 출력 (0) | 2020.07.03 |
아두이노 강좌 #3 시간 관련 함수 설명, delay() 없이 LED Blink 코드 작성 (1) | 2020.07.02 |
아두이노 강좌 #2 디지털핀 GPIO 으로 LED 깜빡이기 (0) | 2020.07.01 |