====== シリアルポート通信のプログラミング (Java) ====== Java SEでシリアルポートを扱うためには、Java CommAPI に準拠した追加のライブラリ "RXTXcomm" を使用します。 * [[https://blogs.oracle.com/jtc/entry/serial_port_communication_for_java|Jim Connors' Weblog - Serial Port Communication for Java SE Embedded]] * [[http://en.wikibooks.org/wiki/Serial_Programming/Serial_Java|WIKIBOOKS - Serial Programming/Serial Java]] ※ 『[[mae3xx_tips:use_socat:start]]』のページで、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:~$ * classpath に /usr/share/java/RXTXcomm.jar * java.library.path に /usr/lib/jni をそれぞれ指定すれば動作しそうです。 \\ ===== 実行 ===== [[http://d.hatena.ne.jp/talisker_ZQN/20130508/1368017726|Cults !! - ARMアーキテクチャ環境のJava7でRXTXをビルドする。]] のサンプルコードを実行してみます。\\ 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" がシリアルポートであると登録されていないことが原因ですので、{{:mae3xx_devel:java_serial_programming:librxtx-java_2.2pre2-11mae1_armhf.deb|パッチをあてたパッケージ}} を作りました。 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 | |{{:mae3xx_devel:java_serial_programming:librxtx-java_2.2pre2-11mae1_armhf.deb|}}|2014/04/24 10:04 163.3 KB|4aa348c80b8d264f882685bed1f0e3e295f79bec|Full Java CommAPI implementation| |{{:mae3xx_devel:java_serial_programming:librxtx-java-dbg_2.2pre2-11mae1_armhf.deb|}}|2014/04/24 10:04 97.7 KB|80c414e75c278d9d4823b8d58045dd41bb79f8c9|Full Java CommAPI implementation, Debugging Symbols|