일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- zynq
- #ComportMaster
- SQLite Studio
- Database
- Embedded linux
- ubutu
- ubuntu
- #UART
- github
- #MCU
- ATMEGA128
- #PuTTY
- Linux
- Interrupt
- #CLCD
- xilinx
- 인터럽트
- #시리얼통신
- #채터링
- #textLCD
- avr
- sqlite
- #Atmega128
- petalinux
- git
- #문자열
- Today
- Total
재잼재잼의 티스토리
6. UART 문자열 송/수신 본문
문자를 송/수신 했지만, 실제 MCU관련 프로젝트를 진행할 때는 문자보다는 문자열을 주고받는 경우가 많다.
문자열 송/수신은 문자 송/수신을 문자열 마지막까지 반복하는 형태로 구성되는데, 여기서 문자열이 어떻게 구성되어 있는지를 알아보자.
Hello Worl라는 문자열을 송신하고자 하면,
char *str = "Hello World"; 로 작성을 한다.
메모리의 str 위치부터 1바이트씩 배열의 형태로 저장이 되는데,
str[0] |
str[1] |
str[2] |
str[3] |
str[4] |
str[5] |
str[6] |
str[7] |
str[8] |
str[9] |
str[10] |
str[11] |
H |
e |
l |
l |
o |
|
W |
o |
r |
l |
d |
\0 |
로 마지막에 '\0'을 포함하여 문자열의 끝임을 표시한다.
예를 들어 ATmega128에서 PC 시리얼 모니터로 출력하기 위해서는 이러한 문자열의 특성을 사용하여
와 같이 코드를 작성할 수 있다.(UART1_transmit는 문자를 전송하는 코드)
반대로, PC의 시리얼 모니터에서 입력한 값을 MCU에서 처리하기 위해서는 PC에서 문자열을 입력할 때 어떻게 처리가 되는지 알아야 한다.
PC에서 Enter키를 누를 경우 발생하는 CR(carriage return) 과 LF(Line Feed)에 대해서 알아보자.
CR은 '\r'로 표현되고, LF는 '\n'으로 표현된다. 일반적인 윈도우 환경에서는 Enter 키를 누르면 CR과 LF가 전송된다.
즉, Hello world를 입력하면 "Hello World\r\n"이 전송된다고 볼 수 있다.
반면에 리눅스 환경에서 Enter키를 입력하면 CR이 붙어서 전송이 되는데, "Hello World\r"가 전송된다고 볼 수 있다.
이런 특성을 사용하여 MCU에서 문자열의 수신작업을 수행할 수 있다.
윈도우 환경에서는 엔터 입력시 \r\n이 입력되므로, \n을 수신할 때 까지 buffer 배열에 저장한다.
시리얼 모니터로 사용하는 ComPortMaster 프로그램이다. 문자열을 3가지 기록해두고 send 버튼을 눌러서 MCU로 송신을 한다.
처음 할 때는 동작하지 않았는데, 엔터키로 입력하는 것이 아니라 send버튼으로 입력을 하기 때문에 문자열에 CR/LF가 붙어서 전송되지 않았다고 생각한다.
프로그램 사용설명서를 보니까 ASCII왼쪽에 체크박스에 체크를 하고 send하면 CR/LF이 붙어서 전송된다고 해서 그렇게 테스트 한 결과다.
----------------------
추가로 PuTTY는 리눅스 방식을 사용하므로 문자열 마지막에 CR 이 붙어서 전송된다.
그래서 시리얼 모니터로 PuTTY를 사용한다면, 문자열 검사할 때 \n 대신 \r 을 검사하면 정상적으로 동작을 한다.
'MCU' 카테고리의 다른 글
8. CLCD 사용하기(2) (0) | 2019.01.23 |
---|---|
7. CLCD 사용하기 (0) | 2019.01.22 |
5.UART 문자 송/수신 (0) | 2019.01.15 |
4. UART사용 - 초기화 (0) | 2019.01.14 |
3. UART 개요 (0) | 2019.01.13 |