Java8でRS-232C(準備編)
バイナリデータをシリアル通信でターゲット機器に送りたい...では、Javaで行きましょう!ということで環境構築を一通り行ないました。
JDKのインストールなど基本的なところは端折ります、といってもORACLEのHPからインストーラーをダウンロードしてインストールするだけですが...
Javaでシリアル通信を行なうためのライブラリとして、Java Communication API(Sun Microsystems)なるものがあるらしいのですが、バグがあるなどあまりよい噂を聞かないのでRXTXライブラリ(仕様としてはJava Communication APIと同じ)を使うことにしました。
前提条件
- Windows7 32bit環境
- JDK8がインストールされていて、jdk1.8.0_x/binのPATHが通っている
- シリアルポートがCOM4として認識されている
- cygwinでjavacおよびjavaする
手順
- RXTXライブラリ(安定版のバイナリrxtx-2.1-7-bins-r2.zip)をダウンロードする
- zipファイルを適当な場所に解凍する
- 一応、INSTALLファイルに目を通す
- RXTXcomm.jarとWindows/i368-mingw32/にあるrxtxParallel.dllとrxtxSerial.dllを適切な場所にコピーする。この手順が非常にわかり難いので後で詳述する。
- エディタでテスト用のJavaファイルを作成し、コンパイルおよび実行できることを確認する。コンパイルは普通に $ javac SerialTest.java、実行は普通に $ java SerialTest でいけるはず。
テスト用のクラス
SerialTest.javaとして、以下のようなコードを用意します。やっていることとしてはシリアル通信ポートを開いてテスト文字列を送信しているだけです。
import java.io.OutputStream; import gnu.io.CommPortIdentifier; import gnu.io.CommPort; import gnu.io.SerialPort; public class SerialTest { public static void main(String arg[]) { try { /* *** シリアルポートを確保する *** */ // 使用するCOMポートを取得 CommPortIdentifier comID = CommPortIdentifier.getPortIdentifier("COM4"); // COMポートを開きます CommPort commPort = comID.open("hoge", 2000); // シリアルポートのインスタンスを生成… SerialPort port = (SerialPort)commPort; /* *** シリアルポートの設定 *** */ // ボーレート、データビット数、ストップビット数、パリティを設定 port.setSerialPortParams( 115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // フロー制御はしない port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); /* *** テスト送信 *** */ OutputStream out = port.getOutputStream(); out.write('t'); out.write('e'); out.write('s'); out.write('t'); /* *** 終了処理 *** */ out.close(); port.close(); } catch (Exception e) { e.printStackTrace(); } } }
ライブラリファイルのコピー
JDKのインストール先(デフォルトならC:\Programs Files\Java)にはjdkとjreがあると思うけど、Javaプログラムの開発に使われるのがjdkで、実行に使われるのがjreです。
zipファイルの中身でコピーすべきファイルは次の3つです。
- rxtx-2.1-7-bins-r2/RXTXcomm.jar
- rxtx-2.1-7-bins-r2/Windows/i368-mingw32/rxtxParallel.dll
- rxtx-2.1-7-bins-r2/Windows/i368-mingw32/rxtxSerial.dll
dllファイルはPATHが通っている場所ならどこでもいいのですが、javacのPATHでもあるjdk1.8.0_x/bin/ の下にコピーします。
クラスライブラリであるjarファイルは jdk/jre/lib/ext/ と jre/lib/ext/ の2箇所にコピーする必要があります。非常にわかり難く私もハマりましたのでツリー図を以下に示します。
jdk/jre/lib/ext/ にライブラリのjarがないと、コンパイルするときにライブラリクラスを見つけられずにコンパイルエラーになります。
一方、jre/lib/ext/ にライブラリのjarがないと、Javaプログラムを実行するときにライブラリクラスを見つけられずにNoClassDefFoundErrorが発生します。