以前紹介したシリアル通信のサンプルプログラムを作ってみました。
import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.Socket; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Arrays; import java.util.Properties; import java.util.StringTokenizer; import java.util.TooManyListenersException; import java.util.Vector; import javax.comm.CommPortIdentifier; import javax.comm.NoSuchPortException; import javax.comm.PortInUseException; import javax.comm.SerialPort; import javax.comm.SerialPortEvent; import javax.comm.SerialPortEventListener; import javax.comm.UnsupportedCommOperationException; import javax.print.attribute.standard.Chromaticity; public class SerialTranslator implements SerialPortEventListener { // SerialPort private SerialPort serialport = null; private InputStream in = null; private OutputStream out = null; /** * */ public SerialTranslator() { super(); } public static void main(String[] args) { SerialTranslator trans = new SerialTranslator(); trans.send(); trans.close(); } /* * ASCIIデータを受信して表示する * ETX(0x02)をデータ送信終了コードとする仕様 */ public void serialEvent(SerialPortEvent event) { try { if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { StringBuffer inputBuffer = new StringBuffer(); int newData = 0; System.out.println("Serial Receive START->"); while (true) { try { newData = in.read();// 入力ストリームから読み込み if (newData == -1 || newData == 0x02) {// EOF or ETX? System.out.println(inputBuffer+"<-END"); break; } if ('\r' == (char)newData) { inputBuffer.append('\n'); System.out.print(inputBuffer); } else { inputBuffer.append((char)newData); } } catch (IOException ex) { System.err.println(ex); return; } } } } catch (Exception e) { e.printStackTrace(); } } /* * シリアルポートを初期化した後 * Key入力されたASCIIコードを送信する */ public void send() { try { // Open new Serial Port. openSerialPort(); BufferedReader keyin = new BufferedReader(new InputStreamReader(System.in)); String keyString; while (true) { try { // Key入力待ち keyString = keyin.readLine(); // EXITと入力された場合は終了 if(keyString.equals("EXIT")){ break; } byte[] bytes = keyString.getBytes(); out.write(bytes); // 出力ストリームにバイト列を書き込む out.flush(); // 出力ストリームをフラッシュ } catch (Exception e) { e.printStackTrace(); continue; } } } catch (Exception e) { e.printStackTrace(); } } /* * ストリーム、シリアルポートのクローズ処理 */ public void close() { try { if(in != null){ in.close(); } if(out != null){ out.close(); } if (serialport != null) { serialport.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * シリアルポートの初期化 * ポート:COM1 * ボーレート:9600 * データビット:8 * ストップビット:1 * パリティ:なし * フロー制御:なし */ private void openSerialPort() { try{ CommPortIdentifier port = CommPortIdentifier.getPortIdentifier("COM1"); // ユニークな名前でシリアルポートを開く SerialPort serialPort = (SerialPort) port.open("SerialTranslator", 30000); // シリアルポートのパラメータを設定 serialPort.setSerialPortParams( 9600, // Baudrate SerialPort.DATABITS_8, // Data Bits SerialPort.STOPBITS_1, // Stop Bits SerialPort.PARITY_NONE); // Parity Bit // Flow Control Mode serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); // イベントリスナー登録 serialPort.addEventListener(this); // シリアルポートがデータを受信した際に教えてねと設定 serialPort.notifyOnDataAvailable(true); // 入力ストリームを取得 in = serialPort.getInputStream(); // 出力ストリームを取得 out = serialPort.getOutputStream(); } catch (Exception e) { e.printStackTrace(); } } private void dumpBytes(byte[] data){ for(int i = 0; i < data.length; i++){ System.out.print("[" + Integer.toHexString(data[i]) + "]"); } System.out.println(); } } |