com.jblend.micro.io
クラス SerialConnection

java.lang.Object
  |
  +--com.jblend.micro.io.SerialConnection
すべての実装インタフェース:
javax.microedition.io.Connection, javax.microedition.io.InputConnection, javax.microedition.io.OutputConnection, javax.microedition.io.StreamConnection

public final class SerialConnection
extends java.lang.Object
implements javax.microedition.io.StreamConnection

シリアルポートにアクセスするためのクラスです。

シリアル制御に対応した Java アプリケーションから javax.microedition.io.Connector.open() メソッドに "serial:" スキームを指定して呼び出すと、 シリアルポートにアクセスするための SerialConnectionオブジェクトを取得することができます。 Connector.open() の引数nameに、以下の形式でシリアルデバイス名を指定します。

"serial:<シリアルデバイス名>[;<オプションパラメータ>;<オプションパラメータ>]"
指定できるシリアルデバイス名は、com0 だけです。 オプションパラメータは、"オプション名 = 値"の形式で指定します。 オプションパラメータは、";"で区切って複数指定することができます。 指定できるオプションパラメータを表1に示します。

表1. オプションパラメータ一覧
オプション名 初期値 指定内容
open_timeout 1000ミリ秒 ポートを開くときのタイムアウト値を指定(単位はミリ秒)。 タイムアウト値を指定していない場合、シリアル制御の接続が確立するまでメソッドから戻らない。
read_blocking "off" データを読み込むときに処理をブロックするかどうかを "on" または "off" で指定。
  • "on":指定されたデータをすべて読み込むまでメソッドから戻らない。また、タイムアウトによる例外も発生しない。
  • "off":その時点で読み込めるデータを読み込んでメソッドから戻る。 また、読み込むデータがない場合は、約500ミリ秒経過するとタイムアウトとして例外が発生する。
write_timeout "on" データを書き込むときにタイムアウトを設定するかしないかを "on" または "off" で指定。
  • "on":送信用バッファに空きがなく書き込みができなくなってから約500ミリ秒経過するとタイムアウトとして例外が発生する。
  • "off":指定されたデータをすべて書き込むまでメソッドから戻らない。また、タイムアウトによる例外も発生しない。

オプションパラメータを指定しない場合は、データの読み込み、書き込みともにタイムアウトによって例外が発生する動作となります。 オプションパラメータを、オープン時のタイムアウト値を1秒、読み込みをブロックモード、書き込みのタイムアウトなしに設定する場合は、 以下のように指定します。


      SerialConnection con = (SerialConnection)Connector.open(
"serial:com0;open_timeout=1000;read_blocking=on;write_timeout=off");

Javaアプリケーションは、System.getProperty() メソッドの引数に "jscl.supports.serial" を指定して呼び出すことで 機器がシリアル制御に対応しているかどうかを取得することができます。 System.getProperty()は、機器がシリアル制御に対応している場合 "true" を返します。 機器がシリアル制御に対応していない場合は "false" または null を返します。

シリアル制御に対応していない機器で Connector.open() を呼び出した場合は、ConnectionNotFoundException が発生します。

シリアル制御はタイマ起動アプリケーションからは利用することはできません。 タイマ起動アプリケーションからから Connector.open() を呼び出した場合は、SecurityException が発生します。

シリアル制御の処理の流れ

以下にシリアルポートにアクセスする処理の流れを示します。

  1. Connector.open() メソッドに "serial:com0" を指定して SerialConnection オブジェクトを取得します。

  2. データを読み込む場合は、取得した SerialConnection オブジェクトの openInputStream()、または openDataInputStream() メソッドによって入力ストリームを開きます。

  3. 入力ストリームを使用してデータを読み込みます。

  4. データの読み込みが終了したら入力ストリームを閉じます。

  5. データを書き込む場合は、取得した SerialConnection オブジェクトの openOutputStream()、または openDataOutputStream() メソッドによって出力ストリームを開きます。

  6. 出力ストリームを使用してデータを書き込みます。

  7. データの書き込みが終了したら出力ストリームを閉じます。

  8. close() メソッドによって SerialConnection を閉じます。

入力ストリームと出力ストリームは、同時に開くことができます。 ただし、すでに入力ストリームを開いている状態で、再度入力ストリームを開くことはできません。出力ストリームも同じです。 以下に入力ストリームを利用してデータを読み込む場合のコード例を示します。

    SerialConnection conn = null;
    try {
        // シリアルポートを開く
        conn = (SerialConnection)Connector.open("serial:com0");
        InputStream in = null;
        try {
            // 入力ストリームを開く
            in = conn.openInputStream();
            // データ読み込み
            int result = in.read(bytearray);
        } catch (Exception e) {
            ...
        } finally {
            if (in != null) {
                try { in.close(); } catch (Exception e) {}
            }
        }
    } catch (Exception e) {
        ...
    } finally {
        if (conn != null) {
            try { conn.close(); } catch (Exception e) {}
        }
    }
 

シリアルポートの状態遷移

図1にシリアルポートの状態遷移を示します。

state_transition.gif

図1. シリアルポートの状態遷移

PORT_IDLE_ALIVE
シリアルポートが閉じた状態です。 Java アプリケーションが起動したときはこの状態です。 Connector.open()によって回線が確立されると PORT_OPENED 状態に遷移します。
PORT_OPENED
回線が確立した通信中の状態です。 対向機器側でシリアルポートを閉じた、または一時停止した場合は PORT_DISCONNECTED 状態に遷移します。 close() によってシリアルポートが閉じられると PORT_IDLE_ALIVE 状態に遷移します。
PORT_DISCONNECTED
対向機器側のシリアルポートが閉じた状態です。通信は不可です。 close() によってシリアルポートが閉じられると PORT_IDLE_ALIVE 状態に遷移します。

例外処理

シリアルポートのオープン、データの読み込み、書き込み処理では、以下の場合に IOException が発生します。

  1. タイムアウトが発生した
  2. データの読み書きができない状態で read()、または write()メソッドを呼び出した
  3. 通信エラーが発生した

1. 2.の例外が発生した場合は、 Java アプリケーションにおいてリトライなどの復帰処理を行ってください。

3.の通信エラーが発生した場合は、ケーブルの接続状態に原因があることが考えられます。 このエラーに対する復帰処理として、Java アプリケーションはユーザーにケーブルの接続し直しを促し、 close() を呼び出してシリアルポートの状態を PORT_IDLE_ALIVE にしてから 対向機器との接続を再度確立する処理を行うことを推奨します。 ただし、他の原因であることも考えられるので、復帰処理はキャンセルできるようにしておくことを推奨します。

表2に例外の詳細とメッセージを示します。

表2. 例外メッセージ一覧
  メッセージ 条件
1 "Serial timeout" タイムアウト
2 "Serial disconnected" 対向機器側のシリアルポートが閉じた状態で read()、または write()メソッド呼び出し
"Serial already closed" シリアルポートが閉じた状態で read()、または write()メソッド呼び出し
3 "Buffer over error" オーバーランエラー
"Frame error" フレームエラー
"Parity error" パリティエラー
"I/O error" その他通信エラー

シリアルポートの情報取得

Javaアプリケーションは、 SerialConnection クラスにより以下のシリアルポートの情報を取得することができます。

以下に シリアルポートの通信速度、状態を取得するコード例を示します。

    SerialConnection conn = null;
    try {
        // シリアルポートのオープン
        conn = (SerialConnection)Connector.open("serial:com0");
        try {
            // 通信速度を取得
            int baudrate = conn.getBaudrate();
            // ポートの状態を取得
            int state = conn.getPortState("com0");
        } catch (Exception e) {
            ...
        } finally {
            ...
        }
    } catch (Exception e) {
        ...
    } finally {
        if (conn != null) {
            try { conn.close(); } catch (Exception e) {}
        }
    }
 

Java アプリケーション作成上の注意点


フィールドの概要
static int PORT_DISCONNECTED
          ポートの状態:使用中、通信不可
static int PORT_IDLE_ALIVE
          ポートの状態:未使用、通信可
static int PORT_OPENED
          ポートの状態:使用中、通信可能
 
コンストラクタの概要
SerialConnection(java.lang.String URI, int mode, boolean timeouts)
          microJBlendが内部で使用します。
 
メソッドの概要
 void close()
          シリアルポートを閉じます。
 int getBaudrate()
          現在の通信速度を取得します。
static int getPortState(java.lang.String portName)
          シリアルポートの状態を取得します。
 int getRxBufferFree()
          受信バッファの空き容量を取得します。
 int getRxBufferSize()
          受信バッファのサイズを取得します。
 int getTxBufferFree()
          送信バッファの空き容量を取得します。
 int getTxBufferSize()
          送信バッファのサイズを取得します。
 java.io.DataInputStream openDataInputStream()
          データ入力ストリームを開きます。
 java.io.DataOutputStream openDataOutputStream()
          データ出力ストリームを開きます。
 java.io.InputStream openInputStream()
          入力ストリームを開きます。
 java.io.OutputStream openOutputStream()
          出力ストリームを開きます。
 int setBaudrate(int baudrate)
          通信速度を設定します。
 
クラス java.lang.Object から継承したメソッド
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

PORT_IDLE_ALIVE

public static final int PORT_IDLE_ALIVE
ポートの状態:未使用、通信可

PORT_OPENED

public static final int PORT_OPENED
ポートの状態:使用中、通信可能

PORT_DISCONNECTED

public static final int PORT_DISCONNECTED
ポートの状態:使用中、通信不可
コンストラクタの詳細

SerialConnection

public SerialConnection(java.lang.String URI,
                        int mode,
                        boolean timeouts)
                 throws java.io.IOException
microJBlendが内部で使用します。 Javaアプリケーションはこのコンストラクタを直接呼び出すことはできません。
パラメータ:
URI - 対象となるシリアルデバイス名やオプションパラメータを指定。詳細はクラスの説明を参照。
mode - シリアルポートを開くときのアクセスモード
timeouts - シリアルポートを開くとき、タイムアウトで例外を発生するかどうかの指定(この設定は無効)
メソッドの詳細

getPortState

public static int getPortState(java.lang.String portName)
シリアルポートの状態を取得します。

引数portNameには、状態を取得するシリアルポート名を "com0" のように指定して下さい。

パラメータ:
portName - 状態を取得するポート名
戻り値:
シリアルポートの状態を以下のどれかで返す
例外:
java.lang.IllegalArgumentException - 存在しないポート名が指定された場合などに発生する

openInputStream

public java.io.InputStream openInputStream()
                                    throws java.io.IOException
入力ストリームを開きます。
定義:
インタフェース javax.microedition.io.InputConnection 内の openInputStream
戻り値:
javax.microedition.io.Connectionに対応した入力ストリーム
例外:
IllegalStateException - ストリームがすでに開いている状態で再度入力ストリームを開こうとした場合に発生する
java.io.IOException - 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生する

openDataInputStream

public java.io.DataInputStream openDataInputStream()
                                            throws java.io.IOException
データ入力ストリームを開きます。
定義:
インタフェース javax.microedition.io.InputConnection 内の openDataInputStream
戻り値:
javax.microedition.io.Connectionに対応したデータ入力ストリーム
例外:
IllegalStateException - ストリームがすでに開いている状態で再度入力ストリームを開こうとした場合に発生する
java.io.IOException - 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生する

openOutputStream

public java.io.OutputStream openOutputStream()
                                      throws java.io.IOException
出力ストリームを開きます。
定義:
インタフェース javax.microedition.io.OutputConnection 内の openOutputStream
戻り値:
javax.microedition.io.Connectionに対応した出力ストリーム
例外:
IllegalStateException - ストリームがすでに開いている状態で再度出力ストリームを開こうとした場合に発生する
java.io.IOException - 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生する

openDataOutputStream

public java.io.DataOutputStream openDataOutputStream()
                                              throws java.io.IOException
データ出力ストリームを開きます。
定義:
インタフェース javax.microedition.io.OutputConnection 内の openDataOutputStream
戻り値:
javax.microedition.io.Connectionに対応したデータ出力ストリーム
例外:
IllegalStateException - ストリームがすでに開いている状態で再度出力ストリームを開こうとした場合に発生する
java.io.IOException - 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生する

close

public void close()
           throws java.io.IOException
シリアルポートを閉じます。
定義:
インタフェース javax.microedition.io.Connection 内の close
例外:
java.io.IOException - 下位デバイスからのエラー通知の場合に発生する

getBaudrate

public int getBaudrate()
                throws java.io.IOException
現在の通信速度を取得します。
戻り値:
通信速度(単位はbps)
例外:
java.io.IOException - 下位デバイスからの情報取得失敗等の場合に発生する

setBaudrate

public int setBaudrate(int baudrate)
                throws java.io.IOException
通信速度を設定します。

現在、このメソッドを呼び出しても速度は変更されません。

戻り値:
変更前の通信速度(単位はbps)
例外:
java.io.IOException - 下位デバイスからの情報取得失敗等の場合に発生する

getTxBufferSize

public int getTxBufferSize()
                    throws java.io.IOException
送信バッファのサイズを取得します。
戻り値:
送信バッファサイズ(単位はバイト)
例外:
java.io.IOException - 下位デバイスからの情報取得失敗等の場合に発生する

getTxBufferFree

public int getTxBufferFree()
                    throws java.io.IOException
送信バッファの空き容量を取得します。
戻り値:
送信バッファの空き容量(単位はバイト)
例外:
java.io.IOException - 下位デバイスからの情報取得失敗等の場合に発生する

getRxBufferSize

public int getRxBufferSize()
                    throws java.io.IOException
受信バッファのサイズを取得します。
戻り値:
受信バッファサイズ(単位はバイト)
例外:
java.io.IOException - 下位デバイスからの情報取得失敗等の場合に発生する

getRxBufferFree

public int getRxBufferFree()
                    throws java.io.IOException
受信バッファの空き容量を取得します。
戻り値:
受信バッファの空き容量(単位はバイト)
例外:
java.io.IOException - 下位デバイスからの情報取得失敗等の場合に発生する