Embedded System/Raspberry Pi

[라즈베리파이] wiringPi를 이용한 시리얼통신

임베지수 2017. 4. 2. 14:44

라즈베리파이에서 시리얼통신(RS232)을 해보자. wiringPi에서 시리얼통신 라이브러리도 만들어놨다. 약간의 설정만 하고 사용하기만 하면 된다. 먼저 라즈베리파이에서 다음과 같이 설정해준다.

 

먼저 /boot/cmdline.txt파일을 백업한다. sudo cp cmdline.txt cmdline_backup.txt 를 입력해서 원본을 복사한다.

 

원본을 복사해놨으니 cmdline.txt 파일을 수정해준다. vi나 nano를 사용해서 수정해주면 된다.

 

ttyAMA0가 들어간 문장들을 삭제해준다.

 

아래처럼 만들고 저장한다.

 

이제 /etc 경로로 이동해서 inittab 파일을 수정한다.

 

맨 아래줄에 T0:23raspawn:/sbin/getty -L ttyAMA0 115200 vt100 이라고 적혀있는놈을 주석처리해준다.

저장하고 sudo reboot 명령어를 사용해서 라즈베리파이를 재부팅해준다.

 

 

자 이제 wiringPi/examples 폴더로 이동해서 make serialTest를 입력하고 serialTest를 컴파일한다. 컴파일을 완료하고 GPIO핀을 아래 그림처럼 연결하면 하드웨어도 준비 끝이다. 일단 루프백테스트를 하기위함이다. 루프백테스트는 rx핀과 tx핀을 연결하고 데이터를 보내고 읽는 테스트다. 즉 자기자신한테 데이터를 보내고 받는것이다.

sudo ./serialTest 를 입력해서 확인해본다.

 

아래는 serialTest의 소스이다.

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
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <string.h>
#include <errno.h>
 
#include <wiringPi.h>
#include <wiringSerial.h>
 
int main ()
{
  int fd ;
  int count ;
  unsigned int nextTime ;
 
  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)  // 두번째 인자값이 보레이트 설정
  {
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;                   
    return 1 ;
  }
 
  if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    return 1 ;
  }
 
  nextTime = millis () + 300 ;
 
  for (count = 0 ; count < 256 ; )
  {
    if (millis () > nextTime)
    {
      printf ("\nOut: %d: ", count) ;
      fflush (stdout) ;
      serialPutchar (fd, count) ; // 데이터 전송해주는 함수
      nextTime += 300 ;
      ++count ;
    }
 
    delay (3) ;
 
    while (serialDataAvail (fd))
    {
      printf (" -> %3d", serialGetchar (fd))  // 데이터 받는 함수
      fflush (stdout) ;
    }
  }
 
  printf ("\n") ;
  return 0 ;
}
 

 

rs232통신 예제가 하나 더 있는데 serialGetchar()를 이용해서 값을 받아오는 예제이다. 역시 examples폴더 안에 serialRead.c파일이 있는데 이놈도 실행해서 컴퓨터랑 실행해보자. 예제는 기본적으로 데이터 8비트, 패리티없음, 스톱비트 1로 되어있다.

즉 115200 8n1이다. 컴퓨터에서도 똑같이 맞줘추자.

컴퓨터랑 통신하기 위해서는 전압레벨을 맞춰야 한다. max3232칩을 이용해서 컴퓨터가 내뿜는 12v를 3.3v로 변환해주는 역할을 해주는 칩인데 필수품이다. 회로는 다음과 같이 구성한다.

 

 

다음은 serialRead의 소스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <string.h>
#include <errno.h>
 
#include <wiringSerial.h>
 
int main ()
{
  int fd ;
 
  if ((fd = serialOpen ("/dev/ttyAMA0", 115200)) < 0)
  {
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
    return 1 ;
  }
 
// Loop, getting and printing characters
 
  for (;;)
  {
    putchar(serialGetchar (fd)) ; // putchar()함수로 serialGetchar()함수로 받아오는 값을 뿌림                   
    fflush (stdout) ;
  }
}

 

시리얼통신에서 사용되는 함수는 serialOpen(), serialPutchar(), serialPuts(), serialGetchar()가 사용된다.

serialOpen()함수는 시리얼을 열어주고 보레이트 설정을 해준다.

serialPutchar()는 캐릭터 하나를 보낸다.

serialPuts()는 문자열을 전송해준다.

serialGetchar()는 캐릭터를 받는다.