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(); } } }