目次

シリアルポート通信のプログラミング (Java)

Java SEでシリアルポートを扱うためには、Java CommAPI に準拠した追加のライブラリ “RXTXcomm” を使用します。

※ 『socat を使う (シリアル-TCP変換, etc.)』のページで、socat を使用してシリアルポートアクセスをソケットプログラミングにしてしまう方法の紹介を追加しました。


RXTXcomm のインストール

Ubuntu Linuxには、標準でパッケージが用意されていますので、それを導入します。

user1@plum:~$ sudo apt-cache search librxtx
librxtx-java - Full Java CommAPI implementation
librxtx-java-dbg - Full Java CommAPI implementation, Debugging Symbols
user1@plum:~$


“apt-get install” でインストールします。

user1@plum:~$ sudo apt-get install librxtx-java
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  librxtx-java
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 185 kB of archives.
After this operation, 884 kB of additional disk space will be used.
Get:1 http://ports.ubuntu.com/ubuntu-ports/ trusty/universe librxtx-java armhf 2.2pre2-11 [185 kB]
Fetched 185 kB in 1s (104 kB/s)        
Selecting previously unselected package librxtx-java.
(Reading database ... 17679 files and directories currently installed.)
Preparing to unpack .../librxtx-java_2.2pre2-11_armhf.deb ...
Unpacking librxtx-java (2.2pre2-11) ...
Setting up librxtx-java (2.2pre2-11) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
localepurge: Disk space freed in /usr/share/locale: 0 KiB
localepurge: Disk space freed in /usr/share/man: 0 KiB

Total disk space freed by localepurge: 0 KiB

user1@plum:~$


どこにライブラリが導入されたか、確認してみます。

user1@plum:~$ sudo dpkg -L librxtx-java | egrep "\.so$|\.jar"
/usr/share/java/RXTXcomm-2.2pre2.jar
/usr/lib/jni/librxtxRS485-2.2pre1.so
/usr/lib/jni/librxtxSerial-2.2pre1.so
/usr/lib/jni/librxtxParallel-2.2pre1.so
/usr/lib/jni/librxtxRaw-2.2pre1.so
/usr/lib/jni/librxtxI2C-2.2pre1.so
/usr/share/java/RXTXcomm.jar
/usr/lib/jni/librxtxParallel.so
/usr/lib/jni/librxtxRaw.so
/usr/lib/jni/librxtxI2C.so
/usr/lib/jni/librxtxSerial.so
/usr/lib/jni/librxtxRS485.so
user1@plum:~$

をそれぞれ指定すれば動作しそうです。


実行

Cults !! - ARMアーキテクチャ環境のJava7でRXTXをビルドする。 のサンプルコードを実行してみます。

Test.java
import gnu.io.CommPortIdentifier;
import java.util.Enumeration;
 
public class Test {
  public static void main(String[] args) {
    System.out.println("main method start.");
    try {
      Enumeration portList = CommPortIdentifier.getPortIdentifiers();
      CommPortIdentifier port = null;
      while (portList.hasMoreElements()) {
        port = (CommPortIdentifier)portList.nextElement();
        System.out.println(port.getName());
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
  }
}


JDK の入ったマシンで .class ファイルを作成し、実機へ転送してから実行します。

user1@plum:~$ sudo java -cp .:/usr/share/java/RXTXcomm.jar -Djava.library.path=/usr/lib/jni Test
main method start.
user1@plum:~$


動作はしているようですが、シリアルポート (ttyO0/ttyO1/ttyO2) が見つからないようです。
RXTXcomm ライブラリで “ttyO” がシリアルポートであると登録されていないことが原因ですので、パッチをあてたパッケージ を作りました。

user1@plum:~$ ls -l *deb
-rw-r--r-- 1 user1 user1 100048 Apr 24 10:00 librxtx-java-dbg_2.2pre2-11mae1_armhf.deb
-rw-r--r-- 1 user1 user1 167170 Apr 24 10:00 librxtx-java_2.2pre2-11mae1_armhf.deb
user1@plum:~$

これをインストールします。

user1@plum:~$ sudo dpkg -i librxtx-java_2.2pre2-11mae1_armhf.deb 
(Reading database ... 17751 files and directories currently installed.)
Preparing to unpack librxtx-java_2.2pre2-11mae1_armhf.deb ...
Unpacking librxtx-java (2.2pre2-11mae1) over (2.2pre2-11) ...
Setting up librxtx-java (2.2pre2-11mae1) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
user1@plum:~$


ふたたび、サンプルを実行してみます。

user1@plum:~$ sudo java -cp .:/usr/share/java/RXTXcomm.jar -Djava.library.path=/usr/lib/jni Test
main method start.
/dev/ttyO2
/dev/ttyO1
/dev/ttyO0
user1@plum:~$

こんどは ttyO0/ttyO1/ttyO2 がシリアルポートとして認識されました。


ダウンロード

File Stat SHA1SUM Info
librxtx-java_2.2pre2-11mae1_armhf.deb2014/04/24 10:04 163.3 KB4aa348c80b8d264f882685bed1f0e3e295f79becFull Java CommAPI implementation
librxtx-java-dbg_2.2pre2-11mae1_armhf.deb2014/04/24 10:04 97.7 KB80c414e75c278d9d4823b8d58045dd41bb79f8c9Full Java CommAPI implementation, Debugging Symbols