2017年4月12日水曜日

Javaで、シリアル通信

Javaで、シリアル通信を行いました。

Javaで、シリアル通信を行うには、古くからある「Java Communications API」を使う方法と、将来的に有望な「Device I/O」を使う方法があるようです。

「Device I/O」の方は、Raspberry Piの情報しか見つからなかったため、「Java Communications API」を使ってみました。
「Java Communications API」の実装は、RXTXを使いました。

環境は、Debian (Jessie)

インストール
$ sudo apt install librxtx-java librxtx-java-dbg


利用方法
classpath に /usr/share/java/RXTXcomm.jar
java.library.path に /usr/lib/jni
を設定する

NetBeansで利用する場合
プロジェクトのプロパティを開く。
「ライブラリ」の項目で、「JAR/フォルダの追加」を選び、RXTXcomm.jarを設定する。
「実行」の項目で、「VM Options」に、-Djava.library.path="/usr/lib/jni"を設定する。


これで、動きました。
整理すると、簡単なことですが、ここに、たどり着くまでが大変でした。

<経緯>
まず、「Java Communications API」を使う方法を探しました。
古いsunの実装は見つからず、代わりに、RXTXの実装を使うと良いと分かりましたが、こちらも、本家のサイトはダウンしていて、見つかりません。
一般のサイトの情報を元に、別のサイトから、ダウンロードして使いました。

プログラムを組んでみると、受信時に、例外も出力せずに落ちました。
久しぶりのJavaのため、Java8になって、何か変わったのかと調べましたが、原因は分かりませんでした。

RXTXの代わりはないかと調べると、PureJavaComm、jSSCがあり、また、現在は、Device I/Oの開発が進められているらしいと知りました。
(Device I/Oの開発が進んでいるようには見えませんでしたが)

ここで、Debianのパッケージに、RXTXがあることを知り、これを使うことで解決しました。

いやはや、遠回りしたものです。
「Java Communications API」は、JDK7に組み込まれているかのような情報もありましたが、どうだったのでしょうか。
とりあえず、RXTXで動いたため、よしとします。

0 件のコメント:

コメントを投稿