본문 바로가기

Embedded/Raspberry Pi3

[Raspberry Pi3] 라즈베리파이3 UART 시리얼 통신

UART란?

universal asynchronous receiver&transmitter의 약자로 비동기 시리얼 통신을 의미한다.

- baud rate (1초에 몇개의 신호가 전송되는가를 나타내는 단위로 비동기식이기 때문에 두 프로세서 간의 속도를 맟춰주어야 한다.)

H/W 연결방법

- RX : 데이터 수신

- TX : 데이터 송신

- RX <-> TX 교차연결

- GND 연결

- baud rate 설정


자료참조 : https://learn.sparkfun.com/tutorials/serial-communication


1. 기본 설정

UART를 사용하려면 Bluetooth를 끊어줘야 한다. 이유는 Bluetooth와 UART가 같은 포트를 사용하여 둘중에 한가지만 사용이 가능하기 때문이다.

우선 라즈베리파이로 부팅 후 다음의 명령어를 입력하여 config.txt 파일을 실행한다.

1

$ sudo nano /boot/config.txt 


여기서 Bluetooth를 사용하지 않도록 코드 맨 밑에 다음의 문장을 추가한다. (#은 해당 문장을 주석 처리)

1

# disable bluetooth 

2

dtoverlay=pi3-disable-bt


설정 후 저장을 한 뒤 다시 터미널창에서 다음의 명령어를 통해 Bluetooth가 Serial을 사용하지 않도록 한다.

1

$sudo systemctl disable hciuart 

2

$reboot


다음과 같이 블루투스가 끊어진걸 확인할 수 있다.

만약 블루투스를 다시 연결하려면 다음과 같다.

우선 라즈베리파이로 부팅 후 다음의 명령어를 입력하여 config.txt 파일을 실행한다.

1

$ sudo nano /boot/config.txt 


여기서 Bluetooth를 사용하지 않도록 설정해놓은 밑의 두 문장을 지운다.

1

# disable bluetooth 

2

dtoverlay=pi3-disable-bt


설정 후 저장을 한 뒤 다시 터미널창에서 다음의 명령어를 통해 Bluetooth가 Serial을 사용하도록 한다.

1

$sudo systemctl enable hciuart 

2

$reboot

확인하면 전과 같이 Bluetooth가 연결된 것을 확인할 수 있다.


2. 장치 연결

1) UART에 사용된 장치로는 PL2303이고 자세히 보면 위에서부터 VCC, GND, TXD, RXD가 표시되어있다.

 

 

2) 위의 장치를 라즈베리파이3에 연결하는데 VCC는 라즈베리파이에 전원을 따로 넣어주고 있기때문에 연결하지 않아도 무방하다.

(라즈베리파이 GPIO 헤더를 확인하고 싶으면 http://cccding.tistory.com/89를 참고하면 된다.)

다음의 표와 같이 연결을 하였다.

Raspberry PI 3

USB to Serial Converter 

5V

5V 

GND 

GND 

RXD 

TXD 

TXD 

RXD 

 


3) PC와 PL2303 연결

간단하게 USB를 PC에 삽입하면 된다.

 

 

3. PC 환경 설정

1)Windows

1-1) 장치 드라이버 설치

PC와 연결하고 장치관리자에서 포트를 확인해보면 느낌표가 떠있는 경우가 있다.

이 경우 http://www.ifamilysoftware.com/news37.html에서 윈도우 버전에 맞는 드라이버를 다운로드 후 설치하면 해결된다.

 

 

설치 후 재부팅을 하고 다시 장치관리자에서 확인하면 정상적으로 포트가 잡힌것을 확인 할 수 있다.

 


bps 속도를 설정해준다.


1-2) putty를 이용한 serial 통신

putty(관리자 권한으로 실행)를 실행하고 Serial을 선택한 뒤 장치관리자에서 확인된 포트번호와 속도를 입력한다. 속도가 맞지 않으면 글씨가 깨지는 경우가 있다. 그래서 라즈베리파이에서 다음의 명령어로 속도를 확인해야 한다.

주의)putty 한글배포판은 글자 깨짐 현상이 있습니다.

1

$  sudo nano /boot/cmdline.txt

 

 

https://putty.ko.softonic.com/ (putty download site , windows에서 다운로드 및 실행)

위에서 속도를 확인 했으면 115200의 속도를 입력해주고 Open을 클릭하면 된다.

 


아래와 같은 화면을 확인 할 수 있다. 아무것도 안뜨는 경우 엔터를 한번 입력해준다.

* raspberrypi login : pi , Password : 설정한 비밀번호(설정을 안했을 경우 default password : raspberry)

 

 

2) Linux

2-1) 장치 연결 확인

다음 명령어를 통해 현재 PC에 PL2303이 연결 되었는지 확인한다.

1

$ lsusb 

 


위의 사진을 보면 PL2303 Serial Port가 연결된 것을 확인 할 수 있다.

2-2) 장치 번호 확인

다음의 명령어를 통해 현재 PC에 PL2303이 연결된 장치 번호를 확인한다.

1

$ dmesg | grep tty 

 


위의 사진에서 맨 밑줄을 보면 마지막으로 연결된 장치가 무엇인지 어떤 장치인지 확인이 가능하다. 본인 PC에서는 pl2303이 ttyUSB0으로 잡혀있다.

2-3) putty를 이용한 Serial 통신

- sudo apt-get install putty(리눅스에서)

- sudo putty

위의 windows에서와 마찬가지로 putty에서 Serial을 선택하고 2-2)에서 확인한 Serial Port 번호(ttyUSB0)와 속도(115200)을 입력한다.

 


장치번호와 속도를 입력한 뒤 Open을 해주면 다음과 같은 화면을 볼 수 있다. 이번에도 마찬가지로 화면이 보이지 않으면 엔터를 한번 입력해준다.

* raspberrypi login : pi , Password : 설정한 비밀번호(설정을 안했을 경우 default password : raspberry)

 

 

4. Test

uart.c

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <wiringPi.h>

#include <wiringSerial.h>


void uart_ch(char ch);

void uart_str(char *str);


int main(void)

{

char str[100]={0,};

        char str1[100]={0,};


if (wiringPiSetup () == -1)

{

    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;

    return 1 ;

}

while(1)

{

scanf("%s",str1);

getchar();

sprintf(str,"%s\n\r",str1);

uart_str(str);

}


return 0 ;


void uart_ch(char ch)

{

int fd ;


if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)

{

fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno));

return;

}


serialPutchar(fd,ch);

close(fd);

}


void uart_str(char *str)

{

while(*str) uart_ch(*str++);

}


wiringPi에서 지원하는 함수는 다음과 같다.

더욱 자세히 알고싶다면 http://wiringpi.com/reference/serial-library/를 참고하면 된다.

  • int serialOpen(char *device, int baud) : 시리얼오픈 함수는 시리얼 포트를 열고 초기화를 하며, 속도(baud rate)를 설정하는 함수이다. 앞의 인자값은 "/dev/ttyAMA0"로 오픈할 시리얼 포트를 지정하며, 두번째 인자는 baud의 통신 속도를 지정하면 된다. 리턴값으로는 에러가 있을 경우 -1을 넘겨준다.
  • int serialGetchar(int fd) : 이 함수는 시리얼 포트에서 한 바이트를 받아서 리턴해주는 함수이다.  fd는 시리얼 포트를 오픈할때 리턴 된 파일 디스크립터이다.
  • void serialClose(int fd) : open했던 시리얼 포트를 닫는다
  • void serialPutchar(inf fd, unsigned char c) : 이 함수는 한바이트만큼 전송한다.
  • void serialPuts(int fd, char *s) : 입출력 함수중 하나로 쉽게 설명해서 fgets로 저장한 문자열을 fd로 전송하게 된다.
  • void serialPrintf(int fd, char *message, ...)
  • void serialFlush(int fd) : 수신된 모든 데이터를 삭제한다.
  • char *fgets(char *string, sizeof(*string), File *stream) : 이 함수는 텍스트 파일에 저장된 문자를 줄 단위로 읽어들어와 반환하는 함수로서 첫번째 인자는 입력 받은 문자열을 저장할 포인터를 뜻하고, 두번째 인자는 입력 받을 문자의 수를 설정하는 것이며, 세번째 인자는 형성한 스트림의 이름을 뜻한다.
    이 함수는 읽어온 문자열에 대한 포인터를 반환하며 파일의 끝에 도달하거나 오류가 발생할 경우 NULL을 반환한다.


컴파일 및 실행

- gcc uart.c -o uart -lwiringPi

- sudo ./uart


결과(왼쪽 -> 라즈베리파이 , 오른쪽 -> pc) - 라즈베리파이에서 키보드 입력시 데이터가 pc로 전달