Javaでのシリアル通信の現状

DE0にRS-232Cポートを半田付けしたのだけど、ターミナルで確認するだけじゃなくてプログラムから通信したくて、まあ込み入った処理をすることもあるだろうなーということでJavaでシリアル通信をしたほうがいいかなと思った。
で、Javaではシリアル通信は標準ではサポートしておらず、Java Communications APIというのがあるということで、Windows版以外はSun microsystemsというところからダウンロードできるということなのだけど、まあリンク切れでOracleという会社のJavaのページに飛ばされちゃいます。


そもそもWindowsで通信したかったので、Java Communications APIの独自実装であるRxTxを使うといいよというアドバイスの元、リンクをクリックしてみるも、ロゴだけのページになってる。
http://rxtx.com/


少し探してみると移行先というサイトがみつかる。
http://users.frii.com/jarvi/rxtx/


でも、ダウンロード先はWikiになってて、そこのトップを見ると、さっきのサイトはOld Page扱いで、「2.2がリリースされたらこっちがホームページになるよ」って書いてある。
ということで、実質はこちらがRxTxのホームページになっているようだ。
http://rxtx.qbang.org/wiki/index.php/Main_Page


ただ、ぼくが欲しいのは64bit版Windows対応だったのだけど、x64対応はあっちへ行け、とこのサイトに誘導された。
http://www.cloudhopper.com/opensource/rxtx/


ここのバイナリを使って試しにコードを書いてみて、DE0で書籍サンプルのRS-232C受信コードを動かすと、無事「abc」の文字コードが表示された。左2桁は通信速度の設定で、9600bpsをあらわしてる。

ちなみに、半田付けは、やはり博多図工室で場所と道具と借りてやりました。道具がいろいろそろってていいですわー。あとはワイヤストリッパ所望。


試したコードはこれ。ただ、SerialPort#getUARTType()を呼び出すと、コンパイルは通るけど実行時に怒られた。

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.OutputStream;

public class SerialTx {
    public static void main(String[] args) throws IOException, NoSuchPortException, PortInUseException, UnsupportedCommOperationException {
        CommPortIdentifier pi = CommPortIdentifier.getPortIdentifier("COM3");
        CommPort cp = pi.open("myapp", 2000);
        try{
            SerialPort sp = (SerialPort) cp;
            sp.setSerialPortParams(
                    9600, 
                    SerialPort.DATABITS_8, 
                    SerialPort.STOPBITS_1, 
                    SerialPort.PARITY_NONE);
            sp.setDTR(true);
            sp.setRTS(false);

            try(OutputStream os = sp.getOutputStream()){
                for(char c : "abc".toCharArray()){
                    os.write(c);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ex) {
                    }
                }
            }
        }finally{
            cp.close();
        }
    }
}