マイクロスクリプトを使って、シリアルポートをアクセスするための文を説明します。
†超漢字Vでシリアルポートを利用するためには、あらかじめ 超漢字V.vmx ファイルでの設定が必要です。
詳細は、「VMware Playerのシリアルポートの作成方法」をご参照ください。
∇シリアルポートのデータ受信の仕組み
シリアルポートから入ってきたデータは、“入力バッファ”に順にためられます。入力バッファの大きさは512バイトです。入力データが512バイトを超すと古いデータから自動的に消されます。入力バッファには、常に最新の512個(バイト)のデータが入っていることになります。
入力バッファとは別に、システム変数$RS[0]~$RS[511]があります。入力データを読みたいときには、RSGET文により入力バッファの内容を$RSにコピーする必要があります。入力バッファの内容を直接読み出すことはできません。
シリアルポートを初期化します。
〈ポート式〉 使用するシリアルポート番号を指定する0~3の値。
〈モード式〉 シリアルポートのモードを指定する10進5桁の値(CFPSD)。
モード | 値 | 内容 |
---|---|---|
C | 0 | CS信号がONの時のみ送信 |
1 | CS信号の状態に無関係に送信 | |
F | 0 | フロー制御なし |
1 | RTS/CTS制御 | |
2 | XON/XOFF制御 | |
3 | XON/XOFF+RTS/CTS制御 | |
4 | 半2重通信1 受信時:RS信号OFF、DTR信号ON 送信時:RS信号ON、DTR信号ON |
|
5 | 半2重通信2 受信時:RS信号OFF、DTR信号ON 送信時:RS信号ON、DTR信号OFF |
|
P | 0 | パリティなし |
1 | 奇数パリティ | |
2 | 偶数パリティ | |
S | 1 | ストップビット1ビット |
2 | ストップビット2ビット | |
D | 5 | 5ビット長 |
6 | 6ビット長 | |
7 | 7ビット長 | |
8 | 8ビット長 |
†C=1のサポートは機種に依存します。
†F=4、5のサポートは機種に依存します。
†0または省略した場合は、0018(フロー制御なし、パリティチェックなし、ストップビット1ビット、データ長8ビット)と見なされます。
†たとえば、“XON/XOFFフロー制御、偶数パリティ、ストップビット2ビット、データ長8ビット”を指定したいときは、モード式は1228となります。
〈通信速度式〉シリアルポートの通信速度(単位:bps)を指定する以下のいずれかの値。
75
150
300
600
1200
2400
4800
9600
19200
38400
57600
115200
†0または省略した場合は9600と見なされます。
†実際に指定したボーレートがサポートされるか、または正常に動作するかどうかは機種に依存します。
一度初期化した後に、再度同じポートに対してRSINIT文を行うと、シリアルポートのハードウェアを初期化し、バッファの内容をすべてクリアします。
RSINIT文は、RSPUTN文、RSPUTC文、RSWAIT文、RSGETN文、RSGETC文を実行する前に必ず実行しておく必要があります。
シリアルポートに〈送信データ式〉(バイト)の列を送信します。最大512個までの送信データ列を記述できます。〈送信データ式〉として部分配列の指定もできます。
RSPUTC文を実行すると、入力バッファの内容はすべてクリア(オールゼロ)されます。〈送信データ式〉を省略するとクリアだけが行われます。
RSPUTC文の実行によって、システム変数$RS、$RSCNTの内容は変化しません。
プログラム例
VERSION 3
DEFINE PORT 0
PROLOGUE
RSINIT PORT,0,9600
EXECUTE RS送信
END
ACTION RS送信
#以下の4バイトのデータをポート0から送る
RSPUT PORT,0x10,0x30,0x42,0xFF
END
RSPUTN文の実行時に、入力バッファの内容をクリアしない点を除くと、RSPUTC文と同じです。
入力バッファに〈受信データ式〉(バイト)列があるかどうかを調べます。もしあれば、システム変数$ERRに0がセットされ、すぐに戻ります。ない場合は、〈受信データ式〉を受信するまで待ちます。
〈タイムアウト式〉は秒単位で指定します。0~86400(24時間)の範囲です。
〈タイムアウト式〉を省略した場合は永久に待ちます。〈タイムアウト式〉が0の場合はすぐ戻ります。タイムアウトで終了したのか、条件を満たして終了したのかは、システム変数$ERRで判断できます。
RSWAIT文の実行によって、システム変数$RS、$RSCNTの内容は変化しません。
プログラム例
VERSION 3
DEFINE PORT 0
PROLOGUE
RSINIT PORT,0,9600
EXECUTE 受信
END
ACTION 受信
RSWAIT PORT,0x10,0x30,0x42,0xFF:10
IF $ERR=0
MESG "受信成功!"
ELSE
MESG "受信不成功"
ENDIF
END
RSWAIT文を実行しても入力バッファの内容はクリアされずに残っています。また、〈タイムアウト式〉が0の場合はすぐに制御が戻ります。そこで、$ERR変数を使用してバッファ内の入力データを検索することができます。したがって、以下のような判断をすることができます。
プログラム例
VERSION 3
DEFINE PORT 0
DEFINE データ列A 0x7A,0x7F
DEFINE データ列B 0x6A,0x60
PROLOGUE
RSINIT PORT 0 9600
EXECUTE 受信
END
ACTION 受信
SLEEP 10000 #この10秒間の間にデータ受信
RSWAIT PORT,データ列A:0
IF $ERR=0
# 〈データ列Aがあったときの処理〉
ELSE
RSWAIT PORT,データ列B:0
IF $ERR=0
# 〈データ列Bがあったときの処理〉
ELSE
# 〈その他の処理〉
ENDIF
ENDIF
END
入力バッファの内容をシステム変数$RSにコピーします。
コピーしたデータの数(バイト数)をシステム変数$RSCNTに設定します。
$RSCNTには、入力バッファが最近にクリアされた以降に入力バッファに入ってきたデータ(バイト)数が設定されます。したがって、$RSCNTが512を超す場合は、最新の512バイトのみが$RSにコピーされ、($RSCNT-512)バイト分のデータが消失したことを意味します。
最初のデータ:$RS[0]
最後のデータ:$RS[$RSCNT-1]
($RSCNT≦512)
$RS[511] ($RSCNT>512)
※最新の512バイトのみが格納されている。
RSGET文を実行しても入力バッファの内容は変化しません。入力バッファのクリア(オールゼロ)は、RSPUTC文、RSGETC文、またはRSINIT文によってのみ行われます。
1つのシリアルポートを、複数のスレッドから同時にシリアルポートを操作した場合の動作は保証されません。
RSGETC文の実行時に、入力バッファの内容をクリアする点を除くと、RSGETN文と同じです。
〈ポート式〉で指定したシリアルポートに対して、〈機能番号式〉で指定した各種動作を行います。
〈機能番号式〉
〈機能番号式〉 | 内容 |
---|---|
0 | 現在の回線状態を取り出して指定した〈変数〉に格納する |
1 | ブレーク信号を100ms送出する(〈変数〉の指定は無視) |
2 | XOFF受信状態を無条件に解除し送信可能とする(〈変数〉の指定は無視) |
11 | ブレーク信号を100ms送出する(〈変数〉の指定は無視) |
12 | ブレーク信号を200ms送出する(〈変数〉の指定は無視) |
13 | ブレーク信号を300ms送出する(〈変数〉の指定は無視) |
14 | ブレーク信号を400ms送出する(〈変数〉の指定は無視) |
15 | ブレーク信号を500ms送出する(〈変数〉の指定は無視) |
16 | ブレーク信号を600ms送出する(〈変数〉の指定は無視) |
17 | ブレーク信号を700ms送出する(〈変数〉の指定は無視) |
18 | ブレーク信号を800ms送出する(〈変数〉の指定は無視) |
19 | ブレーク信号を900ms送出する(〈変数〉の指定は無視) |
〈機能番号式〉=0の時に〈変数〉に格納される回線状態は以下の4ビットの値(0~15)となります。
0....0ABCD
ビット | 値 | 内容 |
---|---|---|
A:DSR (Data Set Ready) 信号線の状態 | 1 | DSR信号線ON |
0 | DSR信号線OFF | |
B:CD (Carrier Detect) 信号線の状態 | 1 | CD信号線ON |
0 | CD信号線OFF | |
C:CS (Clear to Send) 信号線の状態 | 1 | CS信号線ON |
0 | CS信号線OFF | |
D:CI (Calling Indicator) 信号線の状態 | 1 | CI信号線ON |
0 | CI信号線OFF |