출처 : http://blog.naver.com/david_shkim?Redirect=Log&logNo=50112464359

2011/05/30 04:42

복사 http://blog.naver.com/david_shkim/50112464359

Android Serial(COM)Port 사용 하기 ---- [easop에서 가져왔습니다.]


1) Serial Program 받기
        http://code.google.com/p/android-serialport-api/
         Serial Port 관련 정보을 얻을 수 있습니다.
         JNI로 개발 형태로 되어 있습니다.


         Source는 http://android-serialport-api.googlecode.com/svn/trunk/android-serialport-api/
         에서 하나씩 Download 했습니다 . 한번에 받는게 어찌 하는건지 원 ㅠㅠ)

 

2) Cygwin을 통해 포함된 "SerialPort.c"를 컴파일
        Cygwin  ( http://www.cygwin.com/ )
        Android NDK  (http://developer.android.com/sdk/ndk/index.html)

 

        NDK를 받으시면 최신 "android-ndk-r5b"를 받게 되실껍니다.(android-ndk-r5b-windows.zip)
         이전 버전과 컴파일 방식이 약간 다르더군요.
         해당 Project에 jni 폴더에서 "ndk-build -B"를 실행 해야 합니다.
         (ex:"/home/AnNDK/android-ndk-r5/ndk-build -B")
         
3) Eclipse로 앱 컴파일 및 실행
         다운로드 받은 Serial Program을 Eclipse에 로딩(Import)
        Android 시뮬래이터로 연결(혹은 보드로 바로 연결)
        (보드로 바로 연결시에는 adb Driver가 모두 깔릴 상태에서는 자동으로 잡힙니다)


여기까지는 일반적인 JNI 개발및 설정을 하는것입니다.
        (저처럼 처음 하시는 분들은 여러 문서들이 잘 올라와 있으니 잘 찾아보세요.)
        (설정할것도 많고 찾아 봐야 할것도 많고....ㅠㅠ)

        샘플 프로그램도 포함되어있으니 Test도 해보시고 하면 될껍니다.


Program 준비가 완료되었고 실행만 하면 됩니다.

1) 권한 Error
         "You do not have read/write permission to the serial port"

2) 권한 해결-1

         system/cor/init/devices.c에서 
         다음과 같이 추가 하여 권한변경하였습니다.

         { "/dev/s3c2410_serial0",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/s3c2410_serial1",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/s3c2410_serial2",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/s3c2410_serial3",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/ttyS0",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/ttyS1",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/ttyS2",       0777,   AID_ROOT,       AID_ROOT,      0 },
         { "/dev/ttyS3",       0777,   AID_ROOT,       AID_ROOT,      0 },

         /dev/s3c2410_serial0~3은 Odroid-T에서 사용 하는 시리얼 포트입니다.

 

        * ttySAC와 ttyS0의 차는 잘 모르겠내요.. ^^;;;

        시리얼 포트 앱을 실행 하면 Serial Port가 검색 됩니다.
         (저는 총 8개가 잡혀서 모두 777권한으로 바꿨습니다.)
         권한 관련 검색해보시면 많은 자료가 나옵니다.(너무 많다 ㅠㅠ)

 

2) 권한 해결-2
        Superuser 권한 받기 일명 Rooting하기.
        Root Me : Fail
        Universal Androot :  Fail
        SuperOneClickv1.7-ShortFuse : Sucess


         저는 여러가지 돌려 봤는디 "SuperOneClick"로 성공 했습니다.
         (Root Me와 Universal Androot는 앱형태로 Rooting을 하고,
         SuperOneClick는 adb연결로 Rooting을 합니다.


        * Serial Port Program중 public SerialPort()함수를 보면 이런 부분이 있습니다.

                          Process su;
                           su = Runtime.getRuntime().exec("/system/bin/su");
                           String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n";
                           su.getOutputStream().write(cmd.getBytes());
         Superuser 권한으로 권한을 바꾸는 부분입니다.(su -> superuser라는 말 ^^;;)

 

         1번 형태로 권한을 풀경우 요부분이 없어야겠죠? ㅎㅎ

         저는 1번 2번 모두 적용 했습니다.

 

3) 그럼 권한문제는 모두 해결 Program 실행 
         "The serial port can not be opend for an unknown reason." 라는 문구와 함께 Open 중단.
         "IOException"에 걸려서 더이상 진행이 안되는군요.

         http://code.google.com/p/android-serialport-api/에서 확인한결과 (찾는데 올래 걸렸음 ㅠㅠ)
         SerialPort.c파일에서 open Function에서

         fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC); ====>>> fd = open(path_utf, O_RDWR | O_SYNC);

         O_DIRECT를 빼면 된다는군요. 
         빼내고 다시 컴파일.

         

        *O_DIRECT는 아래링크에 설명이 있내요. (뭔소리인지 원~ ㅡ,.ㅡ;;;)

         http://www.ezdoum.com/upload/2/20020718010518/AArcangeli-o_direct.htm

 

4) 자~ 그럼 다시 확인 Go Go

        우선 "/dev/s3c2410_serial2"를 Open하여 PC쪽과 통신 하니 주고 받고 잘하내요.

         Odroid T에서 /dev/s3c2410_serial2를 Debugging용으로 연결 할 수 있어서 Test에 사용
 
        차후에는 /dev/s3c2410_serial1, /dev/s3c2410_serial3을 주로 사용할 예정입니다.
        (추가 3.3v->12v(15v) 변환 레밸쉬푸터를 더 달고요.)

 

====================================================================

 

아~ 모든게 초행길이라(ㅡ.,ㅡ) 돌인지 떵인지 구별이 안되내요....

/dev/s3c2410_serial1 , /dev/s3c2410_serial3번 연결해서

시리얼 모니터링 앱을 만든후에 1차 Serial Port사용을 마물 해야 겠네요.

앱개발도 공부 할겸~.

 

아 ~

ttyS0 이랑 ttySAC에 대해 아시는분 알려주세요~ ^^* (정말 궁굼함 ㅡ.,ㅡ;;)

 

ttyS0가 리눅스에서는 Serial Port라고 하던데.........
여전히 ttyS0~3은 "IOException"에 걸려서 통신이 안되는군요 (ㅎㅎ)

O_DIRECT 를 사용 못하는 이유도 궁굼하구요.

 

문제 해결에 도움주신 분들게 감사 드립니다.

(제 질뭉에 답변글 올려주신 부들께도 감사 드립니다. *^^*)

+ Recent posts