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 프로젝트 파일을 만드실 수 있습니다.


007 ImJa.png

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


001 ImJa.png

▲ 압축 풀기 후에 eclipse를 실행합니다. 적당한 이름으로 워크스페이스를 생성합니다. 본 설명에서는 SerialEcho를 사용합니다.


002 ImJa.png

▲ 이클립스가 실행된 모습입니다. 

003 ImJa.png

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


004 ImJa.png

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


005 ImJa.png

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


006 ImJa.png

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

010 ImJa 프로젝트 생성.png

▲ "lib"를 입력합니다.


jcraft.png

▲ http://www.jcraft.com/jsch/를 방문한 후 하단 Download에서 jsch.jar파일을 lib 폴더에 내려 받습니다.


015 ImJa 프로젝트 생성.png

▲ jsch.jar 파일을 환경 설정에 등록하기 위해 Main Menu>> Windows>> Preferences>> Ant>> Runtime에서 Classpath를 선택하고 [Add JARs...] 버튼을 클릭합니다.


016 ImJa 프로젝트 생성.png

▲ jsch.jar 파일을 선택하고 [OK]버튼을 클릭합니다.


017 ImJa 프로젝트 생성.png

▲ jsch.jar 파일이 등록되었습니다.


018 ImJa 프로젝트 생성.png

▲ 에프에이리눅스 포럼(http://forum.falinux.com)에서 제공하는 imja.jar 파일을 lib 폴더로 내려 받습니다. imja.jar 파일은 ImJa 솔루션 게시판에서 imja.jar 로 검색하시면 최신 버전을 구할 수 있습니다.


021 ImJa 프로젝트 생성.png

▲ lib 폴더에 추가된 imja.jar파일을 오른쪽 마우스 버튼 메뉴를 이용화여 Build Path에 추가합니다.


ant 파일 생성

컴파일과 타겟보드로 실행 파일 전송을 자동으로 실행하도록 ant 파일을 생성하면 디버깅에 많은 도움을 받습니다. ant 파일은 아래와 같이 만들 수 있습니다.


023 ImJa 프로젝트 생성.png

▲ 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭 후 New>> File 메뉴를 실행합니다.


024 ImJa 프로젝트 생성.png

▲ 파일 이름으로 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>

같은 방법으로 build.properties 파일을 생성한 후 아래 내용을 입력합니다.

# NFS folder
nfs.dir=/nfs

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

#java compile version
java.target=1.7

#java jar name
jar.name=appSerailEcho

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

컴파일 후 생성할 실행 파일은 appSerialEcho이며, 타겟 보드의 IP는 192.168.2.75, 아이디 root와 암호 falinux로 로그인한 후 /home에 만들어진 실행 파일을 저장합니다.

027 ImJa 프로젝트 생성.png

▲ Main menu>> Window >> Show View >> Ant 메뉴를 실행합니다.


028 ImJa 프로젝트 생성.png

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


029 ImJa 프로젝트 생성.png

▲ build.xml 파일을 선택하여 Ant 파일을 생성합니다.


030 ImJa 프로젝트 생성.png

▲ 생성한 Ant 파일을 이용하여 컴파일 또는 컴파일과 타겟 보드로 실행 파일을 전송합니다.

소스 파일 생성

031 ImJa 프로젝트 생성.png

▲ src 폴더에서 New>>Class 메뉴를 실행합니다.


032 ImJa 프로젝트 생성.png

▲ Name 항목에 SerialEchoExample를 입력합니다.


035 ImJa 프로젝트 생성.png

▲ 소스 파일이 생성되었습니다.


파일 안에 아래 내용을 입력합니다.

package serialEcho;

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

import java.nio.ByteBuffer;

public class SerialEchoExample extends Serial {

    private Poll poll;

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

    public SerialEchoExample(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.print("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.println(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) {
        
        new SerialEchoExample("/dev/ttymxc1", 115200, 8).run();
    }
}

6. 프로그램 컴파일 및 실행


039 ImJa 프로젝트 생성.png

▲ Ant 탭에서 target_device_upload를 실행하면 컴파일 후 생성된 실행 파일이 타켓 보드로 전송됩니다.


040 ImJa 프로젝트 생성.png

▲ 타켓 보드인 ImJa 보드에 터미널을 이용하여 연결한 후 아래와 같이 자바 프로그램을 실행합니다.

# java -cp appSerialEcho.jar serialEcho.SerialEchoExample

ImJa 보드에 시리얼 케이블을 연결한 후 데이터를 전송하면 수신된 데이타가 화면에 출력됩니다.