본문 바로가기
Embedded

라즈베리파이에서 UART 사용

by gigasound 2021. 10. 10.


UART 사용하기

UART 방식의 통신이 여전히 임베디드에서 사용되고 있습니다. 참으로 오래된 통신 방식이고 단점도 있지만 매우 간단하고 편리하면서 값싸게 구현이 가능하게 때문이겠죠. 물론 관련된 기술적 정보도 튼튼히 많이 있기도 합니다. 

이 글에서는 라즈베리에서 UART를 사용하기 위한 기초인 설정과 검토 방법을 알아보겠습니다. 


시리얼 통신과 UART

흔히 UART 통신을 시리얼 통신(serial communication)이라고 부르지만 엄밀히 말하면 잘못 용어를 적용한 것입니다. 시리얼 통신은 통신 데이터의 비트 표현을 시간에 따라 한 번에 한 비트씩 보내는 방법입니다. 그래서 직렬 통신이라고 부릅니다. 

이와 대응하는 방법이 병렬 통신 (paralled communication)로 데이터를 표현하는 비트들을 동시에 통신으로 전송하는 방법입니다. 이 방법은 과거에는 컴퓨터와 프린터, 컴퓨터와 하드 디스크 등에서 사용되었고, 최근에 4G 통신 wifi 통신 등에 사용됩니다. 반면 시리얼 통신은 UART, I2C, SPI, USB 등에 사용됩니다. 

UART는 Universal Asynchronous Receiver Transmitter의 약자로 비동기형 시리얼 통신이란 의미입니다. 즉 일반적으로 시리얼 통신에는 데이터 비트를 전송할 때 비트단위로 클럭을 함께 사용합니다. 그래서 클럭과 데이터를 동기화하기 때문에 송신 측과 수신 측에서 클럭 속도에 대해 크게 신경 쓰지 않아도 됩니다.

반면 UART는 통신 클럭이 없습니다. 그 대신 송신 측과 수신 측에서 어느 정도의 클럭을 쓸지 상호 약속을 합니다. 이것이 UART의 보 레이트(baud rate)입니다. linux에서는 speed라는 용어로도 사용됩니다. 

보 레이트 또한 아무 값이나 사용하지 않고 약속된 값이 있습니다. 9600 bps(bit per sec) 등이 이에 해당합니다.  이는 1962년에 RS232A, RS232B, RS232C 등으로 UART의 표준을 정했습니다. 꽤 오래되었네요. 그리고 RS422, RS485 등의 장거리 전송 방식으로 확장되었습니다. RS232C는 15m 이내에 사용하도록 규정하고 있는데 실제로는 이보다 짧은 거리에서만 사용이 가능합니다. 


 라즈베리 파이4의 UART 

라즈베리 파이마다 UART의 내용이 다소 다릅니다. 이 글에서는 파이4 에만 적용해 보겠습니다. 이하 글에서는 라즈베리 파이4를 파이라고 부르겠습니다.

파이의 UART 포트 확인 

파이에서 UART의 내용을 보고 싶으면 다음과 실행해 보면 됩니다. uart0~uart5까지 보입니다. 6개의 UART가 보입니다. 이 중에서 UART0는 콘솔용으로 UART1은 Bluetooth가 사용하고 있습니다. 이를 사용자가 사용할 수 있도록 기능을 해지할 수도 있지만, 아직도 4개나 남아 있는데 뭐 그럴 필요가 있을까요. 나머지를 활성화해보겠습니다. 

pi@pi4-30:~ $ dtoverlay -a | grep uart
  midi-uart0
  midi-uart1
  midi-uart2
  midi-uart3
  midi-uart4
  midi-uart5
  miniuart-bt
  qca7000-uart0
  uart0
  uart1
  uart2
  uart3
  uart4
  uart5
pi@pi4-30:~ $

리눅스의 UART를 파일처럼 다룹니다. 실제로 프로그램에서 UART에 송수신은 파일을 다루듯이 실행됩니다. 먼저 기본 포트인 UART0의 내용을 보겠습니다. UART0는 /dev/ttyS0에 해당합니다. 

pi@pi4-30:~ $ ls /dev/ttyS*
/dev/ttyS0

 이 포트의 특성은 다음과 같은 명령어로 볼 수 있습니다.

pi@pi4-30:~ $ dtoverlay -h uart0
Name:   uart0

Info:   Change the pin usage of uart0

Usage:  dtoverlay=uart0,<param>=<val>

Params: txd0_pin                GPIO pin for TXD0 (14, 32 or 36 - default 14)

        rxd0_pin                GPIO pin for RXD0 (15, 33 or 37 - default 15)

        pin_func                Alternative pin function - 4(Alt0) for 14&15,
                                7(Alt3) for 32&33, 6(Alt2) for 36&37
pi@pi4-30:~ $ dmesg | grep ttyS0
[    1.429956] fe215040.serial: ttyS0 at MMIO 0xfe215040 (irq = 38, base_baud = 62500000) is a 16550
pi@pi4-30:~ $

UART의 기본 세팅 정보를 보겠습니다, 여기서 speed 9600 baud로 보 레이트 통신 속도가 설정되어 있습니다.

 

pi@pi4-30:~ $ stty  -a < /dev/ttyS0
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
pi@pi4-30:~ $

보 레이트를 115200 bps로 변경해 보겠습니다. 그리고 다시 확인하면 speed가 변경되었음을 보여줍니다. 

pi@pi4-30:~ $ stty speed 115200 < /dev/ttyS0
9600

pi@pi4-30:~ $ stty  < /dev/ttyS0
speed 115200 baud; line = 0;
-brkint -imaxbel
pi@pi4-30:~ $

파이의 UART 포트

하드웨어 포트 

파이에 40핀의 GPIO 단자가 있습니다. 이 중에서 UART로 활용이 가능한 단자는 다음과 같습니다.

  • /dev/ttyS0 : TxD1 = 8, RxD1 = 10
  • /dev/ttyAMA1 : TxD2 = 27, RxD2 = 28
  • /dev/ttyAMA2 : TxD3 = 7, RxD3=29
  • /dev/ttyAMA3 : TxD4 = 24, RxD4=21
  • /dev/ttyAMA4 : TxD5 = 24, RxD5=33

파이의 UART에 해당하는 파일 이름과 하드웨어 이름이 같지 않습니다. 좀 헷갈립니다.  아래 내용은 더 헷갈립니다. 

포트 활성화

UART를 사용하려면 /boot/config.txt에서 아래와 같이 작성해주면 됩니다. 그리고 반드시 리부팅(reboot) 해야 합니다. 

[all]
enable_uart=1
#/dev/ttyAMA0
dtoverlay=uart0
#/dev/ttyAMA1
dtoverlay=uart2
#/dev/ttyAMA2
dtoverlay=uart3
#/dev/ttyAMA3
dtoverlay=uart4

아래 내용으로 활성화된 UART를 볼 수 있습니다. 

pi@pi4-30:~ $ ls /dev/ttyA*
/dev/ttyAMA0  /dev/ttyAMA1  /dev/ttyAMA2  /dev/ttyAMA3

송수신 검사

통신이 실제로 동작하는지 검사해 보겠습니다. PC 장치와 하드웨어적으로 잘 연결되었다고 간주하고 실험합니다. 

위의 내용에서 speed를 보는 내용이 있습니다. 이를 PC에도 적용하고 realterm이나 putty를 이용해서 모니터 합니다. 

그리고 다음 명령어를 이용하면 파이에서 PC로 문자가 전송됩니다. /dev/ttyAMA1을 사용해 보겠습니다.

echo "Hello" > /dev/ttyS0

cutecom 활용

위의 방법으로는 송수신을 검토하는 것은 좀 어렵겠네요, putty를 사용해도 되지만 putty는 수신 상태만 볼 수 있습니다. minicom은 리눅스에서 UART를 관리하는 프로그램으로 유명하지만, CUI 방식으로 사용하기 불편합니다. 그래서 GUI 방식에서 좀 가볍게 사용할 수 있는  cutecom을 설치합니다.

 sudo apt-get install cutecom

파이의 메뉴->시스템도구->CuteCom을 실행하면 다음의 화면을 볼 수 있습니다. Device를 보면 사용 가능한 UART가 보이고 하나를 선택한 후에 Setting을 누르면 세부적인 통신 방식 등을 결정할 수 있습니다. Input:을 보면 CR/LF가 있는데 이는 전송하는 문장 뒤에 자동으로 제어 문자를 붙여주는 기능입니다. 

 

다른 글에서 C# mono에서 UART를 사용하는 방법을 알아보겠습니다. 


광고좀 꾹 눌러주시면 고맙겠습니다. 


위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.

기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.