"ImJa보드에 자바로만 시리얼 프로그램을 작성하는 방법"에 소개된 시리얼 통신 

샘플 프로그램에 대한 상세 설명입니다.


(1) package serialEcho;  // 패키지 이름은 serialEcho

(2) import com.falinux.imja.Poll;  // imja.jar에 정의된 Poll 객체를 import
(3) import com.falinux.imja.Serial; // imja.jar에 정의된 Serial 객체를 import 

(4) import java.nio.ByteBuffer;  // java 제공 ByteBuffer import

(5) public class SerialEchoExample extends Serial { 

(6)     private Poll poll;  // Poll 객체 선언

(7)     private final ByteBuffer readBuffer = ByteBuffer.allocateDirect(1024);
(8)     private final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(1024);

(9)     public SerialEchoExample(String port, int baudRate, int bits) {
(10)           super(port, baudRate, bits);
         
(11)          poll = new Poll();     // 전체 통신 함수 초기화
(12)          this.open();          // 시리얼 포트 open
         
(13)          poll.rebuild();          // 통신 객체 목록 갱신         
     }
   
     @Override
     public int onDisconnect(long arg0) {   // TCP/IP 연결이 끊겼을 때 발생하는 이벤트. 샘플에서는 무시
          return 0;
     }

     @Override
     public int onError(long arg0) {  // 통신에서 에러가 발생했을 대 발생하는 이벤트. 시리얼 통신에서는 무시
          return 0;
     }

     @Override
     public int onHup(long arg0) { // 통신이 끊겼을 때 발생하는 이벤트. 시리얼 통신에서는 무시
          return 0;
     }

     @Override
     public int onTimeOut(long arg0) { // Poll 타임 아웃 이벤트 
          return 0;
     }

     @Override
     public int onWrite(long arg0) { // 쓰기가 가능한 상태이면 발생하는 이벤트
          return 0;
     }
    
     @Override
(14)     public int onRead(long arg0) { // 읽어 들일 데이터가 있으면 발생하는 이벤트
(15)         System.out.print("onRead.................");
(16)      int readBytes = this.read(readBuffer);     // 수신된 데이터 읽기
(17)      byte[] buf = new byte[readBytes];               // byte배열 선언

(18)      readBuffer.flip();                              // 읽은 데이터 설정
(19)      readBuffer.get(buf);                              // byte배열에 데이터 설정
(20)      readBuffer.compact();                              // bytebuff 포지션 재설정

(21)      writeBuffer.put(buf);                              // 수신된 데이터를 write buffer에 설정
(22)      writeBuffer.flip();                              // write buffer 데이터 설정
(23)      this.write(writeBuffer);                         // 데이터 전송
(24)      writeBuffer.compact();                         // bytebuff 포지션 재설정

(25)      System.out.println(new String(buf, 0, readBytes));

(26)      return readBytes;
     }

(27)     public void run() {
         
(28)        while (true) {
(29)            poll.pollDoLoop(100);
        }
    }

(30)    public static void main(String[] args) {
        
(31)        new SerialEchoExample("/dev/ttymxc1", 115200, 8).run();
    }
}

(1) package serialEcho에서 패키지 이름을 serialEcho로 정의했습니다.

(2~4) 필용한 라이브러리를 import 합니다.

(5) Serial 객체를 상속한 클래스 SerialEchoExample를 정의합니다.

(6) Poll 객체를 선언하고

(7~8) 시리얼 포트로부터 읽기와 쓰기 버퍼를 생성합니다.

(9~13) 클래스 SerialEchoExample의 생성자로 시리얼 포트를 실제 Open하고 Poll 객체를 생성하고 초기화 합니다.

(14~26) 시리얼 포트로부터 수신되면 자동으로 호출되는 이벤트 핸들러입니다.

(16) 시리얼 포트로부터 수신된 데이터를 읽어 들이고

(23) 수신된 데이터를 시리얼 포트로 출력합니다.

(27~28) 프로그램이 계속 실행되는 부분으로 시리얼 포트를 감시하는 Poll 객체 함수를 지속적으로 호출합니다.

Poll 객체의 pollDoLoop(시간) 함수는 지정한 시간만큼 대기하면서 시리얼 포트로부터 수신된 데이터가 있는지 확인하고

없으면 지정된 시간만큼 대기한 후 복귀하며, 대기 중 어느 때라고 수신 데이터가 있으면 (14) onRead() 함수를 호출하고

복귀합니다.

(30) 프로그램의 시작인 main 함수로 시리얼 통신 샘플 객체를 생성합니다. 생성할 때 시리얼 포트의 장치명과 통신 속도, 데이터 비트 크기를 지정해 주어 객체를 생성하게 합니다.


ImJa보드에서의 시리얼 포트 통신, 어떻습니까? Java 프로그램과는 사뭇 다르지요?

while()을 이용한 무한 루프를 실행하지만, 애플리케이션에서 CPU  타임을 돌려주고 슬립하는 sleep()함수처럼

poll 함수도 슬립하기 때문에 시스템에 부하를 주지 않아서 가볍게 실행합니다.

poll 개체의 pollDoLoop() 함수는 이벤트가 발생하든 발생하지 않든, 지정된 시간 안에 반드시 복귀하므로

타이머 함수를 활용하기 쉽습니다.


다음 시간에는 타이머 함수를 이용하여 시리얼 통신에서 에러 처리하는 방법을 소개하겠습니다.