import javax.comm.*; import java.util.*; import java.io.*; public class DumbTerminal extends SerialPortHandler implements Runnable, SerialPortEventListener { protected BufferedReader comReader; protected PrintWriter comWriter; protected BufferedReader sysReader; public DumbTerminal(String portName){ super(portName); try { // SerialPortEvent を受け取るためのリスナの登録 port.addEventListener(this); } catch(TooManyListenersException ex){ ex.printStackTrace(); System.exit(1); } // Data Available イベントを受け取るようにする port.notifyOnDataAvailable(true); try { // RS-232C 入力用の Reader を生成 comReader = new BufferedReader( new InputStreamReader(port.getInputStream())); // RS-232C 出力用の Writer を生成 comWriter = new PrintWriter(new BufferedWriter( new OutputStreamWriter(port.getOutputStream()))); // 入力用の Reader を生成 sysReader = new BufferedReader( new InputStreamReader(System.in)); } catch (IOException ex){ ex.printStackTrace(); System.exit(1); } } // イベント処理ルーチン public void serialEvent(SerialPortEvent event) { switch(event.getEventType()) { case SerialPortEvent.BI: case SerialPortEvent.OE: case SerialPortEvent.FE: case SerialPortEvent.PE: case SerialPortEvent.CD: case SerialPortEvent.CTS: case SerialPortEvent.DSR: case SerialPortEvent.RI: case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // Data Available 以外のイベントは処理しない break; case SerialPortEvent.DATA_AVAILABLE: // Data Available の処理 String buffer = null; try { while (comReader.ready()) { // データの読み込み buffer = comReader.readLine(); System.out.println("> " + buffer); } } catch (IOException e){} break; } } public void start(){ Thread thread = new Thread(this); thread.start(); } public void run(){ String buffer = null; System.out.flush(); while(true){ try { // データの読み込み buffer = sysReader.readLine(); comWriter.println(buffer); comWriter.flush(); } catch (IOException e){} } } public static void main(String[] args){ DumbTerminal terminal = new DumbTerminal(args[0]); terminal.start(); } }