ImJa보드에 자바로만 시리얼 프로그램을 작성하는 방법

2015.04.27 17:45 IT·인터넷/IT 소식

ImJa보드에 자바로만 시리얼 프로그램을 작성하는 방법

Java 언어만으로 시스템을 개발할 수 있는 ImJa 보드 출시 소식을 전했습니다만, 이번 글에서는 과연 ImJa보드를 이용하여 어떻게 Java만으로 프로그램을 작성하는지 보겠습니다. 예제는 시리얼 통신으로 수신된 데이터를 재전송하는 에코 프로그램입니다. 프로그램 작성의 편리를 위해 이클립스 사용을 권합니다.

고급 프로그래머를 위해 먼저 간단히 먼저 설명해 드립니다.

  • Eclipse IDE for java EE Developers를 내려받아 설치합니다.
  • 새로운 Java Project를 생성합니다.
  • lib 폴더를 생성한 후
  • http://www.jcraft.com/jsch에서 제공하는 jsch 파일을 lib 디렉토리로 다운로드 받습니다.
  • jsch 파일을 환경설정>>ant>>Runtime의 Add JARs로 등록합니다.
  • 에프에이리눅스에서 제공하는 라이브러리 파일 ImJa.jar(http://forum.falinux.com/zbxe/index.php?mid=ImJa&document_srl=848846) 파일을 lib 디렉토리로 다운로드 받은 후
  • ImJa.jar 파일을 Build Path에 추가합니다.
  • Java 프로그램을 작성합니다.
  • build.xml 파일과 build.properties 파일을 생성한 후 Ant에 등록하여 컴파일 및 프로그램을 실행합니다.

ImJa보드를 위한 이클립스 프로젝트 파일 생성 상세 설명

ImJa 보드에서 실행하는 자바 프로그램을 작성하는 방법을 상세하게 설명하겠습니다. 아래의 순서를 따라 하시면 쉽게 ImJa 프로젝트 파일을 만드실 수 있습니다.

ImJa보드 임베디드 보드

https://www.eclipse.org/downloads 에서 "Eclipse IDE for java EE Developers"를 내려 받아 적당한 곳에 풀어 놓습니다.

JaVa개발자

▲ 압축 풀기 후에 eclipse 파일을 실행합니다.

에프에이리눅스

▲ Main Menu>>Windows>>Preferences>>General>>Workspace에서 Text file encoding을 UTF-8로 설정합니다.

임베디드 시스템

▲ Main Menu >> File >> New >> Project를 선택한 후 Java Project를 선택합니다.

ImJa보드 임베디드 보드

▲ Project name에 serialEcho를 입력합니다.

JaVa개발자

▲ serialEcho 프로젝트가 생성되었습니다.

에프에이리눅스

▲ Main Menu>>File>>New>>Folder 메뉴를 선택합니다.

임베디드 시스템

▲ lib라고 입력합니다.

ImJa보드 임베디드 보드

http://www.jcraft.com/jsch/ 사이트를 방문한 후 jsch 파일을 lib 디렉토리로 다운로드받습니다.

JaVa개발자

▲ 위 그림처럼 이클립스에서 생성한 lib 폴더로 jsch 파일을 내려 받습니다.

에프에이리눅스

▲ 이클립스로 돌아와서 F5키로 프로젝트 파일 내용을 갱신합니다.

임베디드 시스템

▲ Main Menu>>Windows>>Preferences>>Ant>>Runtime에서 Classpath를 선택하고 [Add JARs...] 버튼을 클릭합니다.

ImJa보드 임베디드 보드

▲ jsch 파일을 선택합니다.

JaVa개발자

▲ jsch 파일 정상적으로 등록되었습니다.

에프에이리눅스

▲ 에프에이리눅스(주)에서 제공하는 imja.jar 파일을 lib 폴더에 복사합니다.  imja.jar 파일은 아래 링크에서 구할 수 있습니다.

임베디드 시스템

▲ 이클립스에서 패키지 탐색기를 F5 키로 갱신한 후 imja.jar 파일을 선택하고 오른쪽 마우스 버튼 메뉴에서 Build Path>>Add to Build Path 메뉴를 실행합니다.

ant 파일 생성

C언어의 Makefile에 해당하는 ant 파일을 생성합니다.

ImJa보드 임베디드 보드

▲ 파일을 생성하기 위해 프로젝트 이름에서 New>>File 메뉴를 실행합니다.

JaVa개발자

▲ File name에 build.xml이라고 입력합니다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- 프로젝트 이름을 입력한다. -->
<project name= "ImJa_example" basedir= ".">

 

         <!-- 빌드 프로퍼티 파일 -->
         <property file= "build.properties" />
       

         <!-- Java Compile-->
         <target name= "compile" description= "Compile!!!" depends= "">
                <echo message="------------------------------" />
                <echo message="Java Compile!!!!  " />
                <echo message="------------------------------" />
                <javac target= "${java.target}"
                        nowarn="true"
                        deprecation="true"
                        debug="true"
                        listfiles="false"
                        failonerror="true"
                        optimize="false"
                        includeantruntime="false"
                        srcdir="${basedir}/src"
                        destdir="${basedir}/bin"
                        encoding="${java.compile.encoding}">
                </javac>
         </target>

         <!-- make jar-->
         <target name= "make_jar_nfs" depends= "compile">
                <echo message="------------------------------" />
                <echo message=" Make Jar : ${jar.name}.jar" />
                <echo message="------------------------------" />
                <mkdir dir= "./jar" />
                <jar destfile="${nfs.dir}/${jar.name}.jar" basedir="${basedir}/bin">
                </jar>
         </target>
       
         <!-- target device upload-->
         <target name= "target_device_upload" depends= "make_jar_nfs">
                <echo message="------------------------------" />
                <echo message=" Target device Upload" />
                <echo message="------------------------------" />
           <scp  file="${nfs.dir}/${jar.name}.jar"
            todir="${target.id}@${target.ip}:${target.dir}"
            password="${target.pw}"
                 trust="true"/>
         </target>

</project>

▲ 파일에 위 xml 코드를 삽입합니다.

# NFS folder
nfs.dir=/nfs

#java encoding
java.compile.encoding=UTF-8

#java compile version
java.target=1.7

#java jar name
jar.name=imja_example

#upload target info
target.id=root
target.pw=falinux
target.dir=/home
target.ip=192.168.4.91

▲ 같은 방법으로 build.properties 파일을 생성한 후 위 내용을 입력합니다. 빨간색 줄로 표시한 target.ip 값은 사용하고 있는 타겟보드의 IP를 입력하면 됩니다.

에프에이리눅스

▲ build.properties 파일이 등록된 모습입니다.

임베디드 시스템

▲ Ant 파일을 등록하기 위해 메인 메뉴에서 Window>>Show View>>Ant 메뉴를 선택합니다.

ImJa보드 임베디드 보드

▲ Ant 탭에서 + 버튼을 클릭합니다.

JaVa개발자

▲ 생성한 build.xml 파일을 선택합니다.

에프에이리눅스

▲ 이제 Ant 기능을 이용해서 컴파일하거나 NFS 폴더로 복사, 타겟 디바이스로 업로드 등을 할 수 있습니다.

*프로그램 코딩

프로젝트 생성이 완료되었습니다. 이제 프로그램 소스를 작성하면 됩니다. 설명을 돕기 위해 시리얼 포트로 입력된 데이터를 그대로 반송하는 에코 프로그램을 작성해 보겠습니다.

임베디드 시스템

▲ src 폴더에서 마우스 오른쪽 버튼 메뉴>>New>>Class를 실행한 후 SerialEchoMain.java로 이름을 넣어 파일을 생성합니다.

ImJa보드 임베디드 보드

▲ 아래의 샘플 코드를 입력해서 프로그램을 완성합니다.

package serialEcho;

import com.falinux.imja.Poll;
import com.falinux.imja.Serial;

import java.nio.ByteBuffer;

public class SerialEchoMain extends Serial {

    private Poll poll;

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

    public SerialEchoMain(String port, int baudRate, int bits) {
          super(port, baudRate, bits);
        
          poll = new Poll();     // 전체 통신 함수 초기화
          this.open();          // 시리얼 포트 open
        
          poll.rebuild();          // 통신 객체 목록 갱신
        
     }
  
     @Override
     public int onDisconnect(long arg0) {
          return 0;
     }

     @Override
     public int onError(long arg0) {
          return 0;
     }

     @Override
     public int onHup(long arg0) {
          return 0;
     }

     @Override
     public int onRead(long arg0) {
         System.out.println("onRead.................");
      int readBytes = this.read(readBuffer);     // 수신된 데이터 읽기
      byte[] buf = new byte[readBytes];               // byte배열 선언

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

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

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

      return readBytes;
     }

     @Override
     public int onTimeOut(long arg0) {
          return 0;
     }

     @Override
     public int onWrite(long arg0) {
          return 0;
     }
   
  
     public void run() {
        
        while (true) {
            poll.pollDoLoop(100);
        }
    }

    public static void main(String[] args) {
       
         if (args.length < 2) {
            
              System.out.println("java com.falinux.example.SerialExample /dev/ttyUSB0 115200 8");
              System.exit(1);
         }
        new SerialExample("/dev/ttyUSB0", 115200, 8).run();
    }
}

▲ 시리얼 포트로 입력된 데이터를 에코하는 프로그램입니다.

프로그램 실행

JaVa개발자

▲ 이제 (1) Ant에서 target_device_upload를 실행하면 (2) 컴파일 후에 자동으로 실행 패키지가 타겟보드로 전송됩니다.

에프에이리눅스

▲ 터미널 프로그램을 실행한 후 타겟보드에 연결합니다. /home에 패키지 파일을 전송했으므로 /home으로 이동 후에 프로그램을 실행합니다.

]# java -cp appSerialEcho.jar serialEcho.SerialEchoMain

appSerialEcho.jar은 생성된 파일이며 패키지 이름 serialEcho에서 main 함수가 있는 SerialEchoMain를 호출하여 실행한 것입니다.

임베디드 시스템

▲ 타켓보드에 시리얼 케이블을 연결하고 데이터를 전송하면 그대로 반송되어 오는 것을 확인할 수 있습니다.

어떻습니까? Java 언어로 시리얼 통신 프로그램을 작성할 수 있지만, C언어로 작성된 라이브러리를 이용하는 예제 샘플을 보면 차이가 나지요? ImJa 보드는 C언어의 장점과 Java 언어의 장점을 함께 이용할 수 있습니다. 앞으로 더욱 다양한 샘플을 소개하겠습니다. Java 언어만으로 임베디드 시스템을 구축할 수 있는 ImJa보드에 많은 관심 부탁드립니다.

신고
이 댓글을 비밀 댓글로