9. 시리얼통신-라즈베리 통신하기-후에 블루투스로 통신

참고1 .http://embejide.tistory.com/40 (http://cafe.naver.com/pipc/2169)

          http://blog.naver.com/kimyosep0331/140194362360

참고2. http://cafe.naver.com/openrt/484


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

~로 시작하는건 일종의 C드라이브 개념이고. "cd /"를 해야 더 상위인 root에 갈 수 있다.


2. 참고1 블로그에 있는 것처럼 cmdline.txt 내용을 지우면...

이상하게 에러가 난다.

원인은 read only이기 때문!  설정을 바꿔주기 위해 모드를 변경한다.

ls -al로 전체 파일 조건을 보고

sudo chmod 777 로 모든 권한을 조정한다.

그리고 텍스트파일 켜서 

삭제.                                                                                                  (출처 참고1).


3. 이제 cd .. -> etc경로 -> inittab파일을 수정한다.


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

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

#이 주석...                                                                                      (출처 참고1).


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


 (출처 참고1).

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

serialTest.c 코드


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
#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)  // 두번째 인자값이 보레이트 설정
  {   // fd가 -1이면 아래 처럼 unable 나온다.
    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 ;   // millis() 함수는 값이 일정하게 증가하는 함수
 
  for (count = 0 ; count < 256 ; )   //
  {
    if (millis () > nextTime)
    {
      printf ("\nOut: %d: ", count) ;
      fflush (stdout) ;                //뭐하는 변수인지... fflush
      serialPutchar (fd, count) ; // 데이터 전송해주는 함수, count 값이 TX로 가나보다.
      nextTime += 300 ; //delay 역할?
      ++count ;
    }
 
    delay (3) ;
 
    while (serialDataAvail (fd))  // DataAvail은 Rx에 신호가 있을 때 실행됨.
    {
      printf (" -> %3d", serialGetchar (fd)) ;  // 데이터 받는 함수
      fflush (stdout) ;
    }
  }
 
  printf ("\n") ;
  return 0 ;
}

코드를 분석해보자!

26번줄의 millis() 함수는 어느 값에서 부터 일정하게 조금씩 증가하는 함수로 판명되었다. 

30~37번의 if문을 보면 millis()가 netxTime보다 커야 하는데 이것은 처음부터 불가능하므로 millis()함수가 일정하게 증가하는 것으로 볼 수 있고 이것이 +next값을 넘을 때마다 if문이 실행되는 것을 알 수있다. 또 +next가 되고 그것이 또 커지면 if문 실행.


 41~46번줄의 serialDataAvail 함수는 RX에 입력이 있을 때 1을 출력하는 함수로 판명되었다. 그래서 while문이 실행된거지. 확인을 위해 int a=0;을 선언하고 아래와 같이 코드를 작성.

결과는 아래처럼 나온다.





5. 이제 실행해보면! TX -> RX 출력이 보인다.

설정

트랙백

댓글