라즈베리파이에서 시리얼통신(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()는 캐릭터를 받는다.
'Embedded System > Raspberry Pi' 카테고리의 다른 글
[라즈베리파이] SPI 버퍼할당 문제 발견ㅜㅜ (2) | 2017.04.02 |
---|---|
[라즈베리파이] wiringPi를 이용한 GPIO사용 (4) | 2017.04.02 |
[라즈베리파이] usb허브 외부전원 만들기 (12) | 2017.04.02 |
[라즈베리파이] 방열판 제작기 (6) | 2017.04.02 |
[라즈베리파이] SSH, PuTTY 사용하기 (8) | 2017.04.02 |