31 August 2012

Javaではシリアルやパラレルポートを制御するためのAPIとして、Java Communication APIが定義されています。Windowsでは、このAPIの最新の実装が提供されていないため、オープンソース実装のRXTXを利用します。

通常はDownloadsからコンパイル済みのバイナリをダウンロードしますが。インストールするPCはWindows7 64bit版なので、64ビット版のバイナリを以下のサイトからダウンロードします。

インストールは、 Installation for Windows - Rxtx を参考に、展開したファイルをJREまたはJDKのフォルダにコピーします。

コピー win64\rxtxSerial.dll C:\Java\jdk1.7.0_06\bin
コピー RXTXcomm.jar C:\Java\jdk1.7.0_06\jre\lib\ext

参考

以下に通信をエコーするだけのサンプルを置いておきます。

import java.io.*;
import java.util.*;
import gnu.io.*;

public class serial implements SerialPortEventListener {
    private SerialPort port;
    private static BufferedReader reader;

    serial() {
        try {
            // Serial port initialize
            CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM5");
            port = (SerialPort)portId.open("serial", 2000);

            port.setSerialPortParams(
                9600,                   // 通信速度[bps]
                SerialPort.DATABITS_8,   // データビット数
                SerialPort.STOPBITS_1,   // ストップビット
                SerialPort.PARITY_NONE   // パリティ
            );
            port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);

            reader = new BufferedReader(
                     new InputStreamReader(port.getInputStream()));

            try {
                port.addEventListener(this);
                port.notifyOnDataAvailable(true);
            } catch (TooManyListenersException e) {
                System.out.println("Error: " + e);
            }

        } catch (Exception e) {
            System.out.println("Error: " + e);
            System.exit(1);
        }
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader br = new BufferedReader(isr);
            OutputStream out = port.getOutputStream();
            boolean flagQuit = false;
            while (!flagQuit) {
                String input = br.readLine();
                if (input.length() > 0) {
                    if (input.equals(":quit"))
                        break;
                    input += "\r";
                    out.write(input.getBytes("US-ASCII"));
                }

            }

            port.close();

        } catch (Exception e) {
            System.out.println("Error: " + e);
        }
    }

    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            String buffer = null;
            try {
                while (reader.ready()) {
                    buffer = reader.readLine();
                    System.out.println(buffer);
                }
            } catch (IOException ex){
                ex.printStackTrace();
                System.exit(1);
            }
        }
    }

    public static void main(String arg[]) {
        serial serial = new serial();
        serial.run();
    }
}


blog comments powered by Disqus