|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object | +--com.jblend.micro.io.SerialConnection
シリアルポートにアクセスするためのクラスです。
シリアル制御に対応した Java アプリケーションから javax.microedition.io.Connector.open() メソッドに "serial:" スキームを指定して呼び出すと、 シリアルポートにアクセスするための SerialConnectionオブジェクトを取得することができます。 Connector.open() の引数nameに、以下の形式でシリアルデバイス名を指定します。
"serial:<シリアルデバイス名>[;<オプションパラメータ>;<オプションパラメータ>]"指定できるシリアルデバイス名は、com0 だけです。 オプションパラメータは、"オプション名 = 値"の形式で指定します。 オプションパラメータは、";"で区切って複数指定することができます。 指定できるオプションパラメータを表1に示します。
オプション名 | 初期値 | 指定内容 |
---|---|---|
open_timeout | 1000ミリ秒 | ポートを開くときのタイムアウト値を指定(単位はミリ秒)。 タイムアウト値を指定していない場合、シリアル制御の接続が確立するまでメソッドから戻らない。 |
read_blocking | "off" | データを読み込むときに処理をブロックするかどうかを "on" または "off" で指定。
|
write_timeout | "on" | データを書き込むときにタイムアウトを設定するかしないかを "on" または "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 が発生します。
openInputStream()
、または openDataInputStream()
メソッドによって入力ストリームを開きます。
openOutputStream()
、または openDataOutputStream()
メソッドによって出力ストリームを開きます。
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にシリアルポートの状態遷移を示します。
図1. シリアルポートの状態遷移
PORT_IDLE_ALIVE
PORT_OPENED
状態に遷移します。
PORT_OPENED
PORT_DISCONNECTED
状態に遷移します。
close()
によってシリアルポートが閉じられると PORT_IDLE_ALIVE
状態に遷移します。
PORT_DISCONNECTED
close()
によってシリアルポートが閉じられると PORT_IDLE_ALIVE
状態に遷移します。
シリアルポートのオープン、データの読み込み、書き込み処理では、以下の場合に IOException が発生します。
1. 2.の例外が発生した場合は、 Java アプリケーションにおいてリトライなどの復帰処理を行ってください。
3.の通信エラーが発生した場合は、ケーブルの接続状態に原因があることが考えられます。
このエラーに対する復帰処理として、Java アプリケーションはユーザーにケーブルの接続し直しを促し、
close()
を呼び出してシリアルポートの状態を PORT_IDLE_ALIVE
にしてから
対向機器との接続を再度確立する処理を行うことを推奨します。
ただし、他の原因であることも考えられるので、復帰処理はキャンセルできるようにしておくことを推奨します。
表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 アプリケーションが一時停止した場合、シリアルポートの状態はPORT_DISCONNECTED
となります。 一時停止を行った側のバッファはクリアされるため、対向機器側において受信データの状態を確認(簡易プロトコルの対応を行うなど)することを推奨します。Java アプリケーションが再開して再度シリアル制御を開始する場合、シリアルポートの状態を
PORT_IDLE_ALIVE
とするためにclose()
を呼び出してシリアルポートの状態の整合性を取る必要があります。 Java アプリケーションが一時停止する前にclose()
を呼び出してシリアルポートの状態がPORT_IDLE_ALIVE
となっている場合は必要ありません。
Connector.open() 直後は、ケーブルで接続された機器間で速度の設定などの処理を行っています。 この間に OutputStream.write() を呼び出してデータの書き込みを行った場合、動作の保証はできません。 したがって、Connector.open() の直後は最低でも 500 ミリ秒の間隔をあけてデータの書き込み処理を行ってください。
フィールドの概要 | |
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 |
フィールドの詳細 |
public static final int PORT_IDLE_ALIVE
public static final int PORT_OPENED
public static final int PORT_DISCONNECTED
コンストラクタの詳細 |
public SerialConnection(java.lang.String URI, int mode, boolean timeouts) throws java.io.IOException
URI
- 対象となるシリアルデバイス名やオプションパラメータを指定。詳細はクラスの説明を参照。mode
- シリアルポートを開くときのアクセスモードtimeouts
- シリアルポートを開くとき、タイムアウトで例外を発生するかどうかの指定(この設定は無効)メソッドの詳細 |
public static int getPortState(java.lang.String portName)
引数portNameには、状態を取得するシリアルポート名を "com0" のように指定して下さい。
portName
- 状態を取得するポート名java.lang.IllegalArgumentException
- 存在しないポート名が指定された場合などに発生するpublic java.io.InputStream openInputStream() throws java.io.IOException
javax.microedition.io.InputConnection
内の openInputStream
IllegalStateException
- ストリームがすでに開いている状態で再度入力ストリームを開こうとした場合に発生するjava.io.IOException
- 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生するpublic java.io.DataInputStream openDataInputStream() throws java.io.IOException
javax.microedition.io.InputConnection
内の openDataInputStream
IllegalStateException
- ストリームがすでに開いている状態で再度入力ストリームを開こうとした場合に発生するjava.io.IOException
- 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生するpublic java.io.OutputStream openOutputStream() throws java.io.IOException
javax.microedition.io.OutputConnection
内の openOutputStream
IllegalStateException
- ストリームがすでに開いている状態で再度出力ストリームを開こうとした場合に発生するjava.io.IOException
- 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生するpublic java.io.DataOutputStream openDataOutputStream() throws java.io.IOException
javax.microedition.io.OutputConnection
内の openDataOutputStream
IllegalStateException
- ストリームがすでに開いている状態で再度出力ストリームを開こうとした場合に発生するjava.io.IOException
- 回線が切断、またはポートが閉じているなど、その他のエラーの場合に発生するpublic void close() throws java.io.IOException
javax.microedition.io.Connection
内の close
java.io.IOException
- 下位デバイスからのエラー通知の場合に発生するpublic int getBaudrate() throws java.io.IOException
java.io.IOException
- 下位デバイスからの情報取得失敗等の場合に発生するpublic int setBaudrate(int baudrate) throws java.io.IOException
現在、このメソッドを呼び出しても速度は変更されません。
java.io.IOException
- 下位デバイスからの情報取得失敗等の場合に発生するpublic int getTxBufferSize() throws java.io.IOException
java.io.IOException
- 下位デバイスからの情報取得失敗等の場合に発生するpublic int getTxBufferFree() throws java.io.IOException
java.io.IOException
- 下位デバイスからの情報取得失敗等の場合に発生するpublic int getRxBufferSize() throws java.io.IOException
java.io.IOException
- 下位デバイスからの情報取得失敗等の場合に発生するpublic int getRxBufferFree() throws java.io.IOException
java.io.IOException
- 下位デバイスからの情報取得失敗等の場合に発生する
|
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | ||||||||
概要: 内部クラス | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |