2005年10月21日金曜日

シリアル通信 その2 By直井

以前紹介したシリアル通信のサンプルプログラムを作ってみました。

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