~ シンプル通信 For .net(Rs-232c)のリファレンス ~

名前空間
using Aoyama.Rs232;

プロパティ
プロパティ名 意味 設定値 説明
Password ライセンスキー string ライセンスキー ベクターにて、送金すると、ライセンスキーが得られます。
このプロパティに、そのライセンスキーを設定すると、制限が解除されます。
シリアルポート(Rs-232C)に関する項目
Port シリアルポートの番号 int 1,2,他 Windowsで対応するポートを設定できます。
Bps ボーレート int 256000,128000,
115200,57600,
56000,38400,
19200,14400,
9600,4800,2400,
1200,600,300,
110, 他
シリアルポートのボーレートを設定します。
任意の値も設定できますが、その動作は保証できません。
また、115200bpsより高速な設定に関しては、設定は可能ですが、機器により動作しないことがあります。
Bit ビット int 8,7,6,5 シリアルポートのビットを設定します。
Parity パリティ ParityValue none
odd
even
mark
space
シリアルポートのパリティを設定します。
none(0: ノンパリティ)
odd(1: 奇数パリティ)
even(2: 偶数パリティ)
mark(3: マーク)
space(4: スペース)

例:rs232c1.Parity = ParityValue.none;
StopBit ストップビット StopBitValue one
onePointFive
two
シリアルポートのストップビットを設定します。
one(0: 1ビット)
onePointFive(1: 1.5ビット)
two(2: 2ビット)

例:rs232c1.StopBit = StopBitValue.one;
Flow フロー制御 HandshakeValue none
DtrDsr
RtsCts
XonXoff
シリアルポートのフロー制御を設定します。
バイナリモードの場合、(Xon・Xoff)は使用できません。
none(0: なし)
DtrDsr(1: DTR・DSR)
RtsCts(2: RTS・CTS)
XonXoff(4: Xon・Xoff)

例:rs232c1.Flow = HandshakeValue.none;

(注)none以外に設定した場合、WriteModeプロパティが nowaitに設定されます。
コントロールに関する項目
ReadMode 受信モード ReadModeValue eventmode
pollingmode
受信データの受け取りをイベントで行うのか、ポーリングで行うのかを設定します。
eventmode(0: イベント)
pollingmode(1: ポーリング)

ポーリングに設定した場合、イベントは発生しません。受信データは、Readメソッドを用いて取得します。
イベントに設定した場合、イベントが発生しますので、受信データは、イベント内で取得します。

例:rs232c1.ReadMode = ReadModeValue.eventmode;
WriteMode 送信モード WriteModeValue nowait
wait
nowait(0: 送信完了を待たない)
wait(1: 送信完了を待つ)

送信完了を待たない設定(0)の場合、Writeメソッドを実行すると、すぐに制御が返ります。
送信完了を待つ設定(1)の場合、送信完了まで制御が返りません。そのため、フロー制御を行っていると、送信が終了せず、プログラムが停止しているように見えることがあります。その場合、WriteTimeOutプロパティの設定を変更することにより、タイムアウト時間を変更できますので調整してください。

例:rs232c1.WriteMode = WriteModeValue.wait;

(注)
 このプロパティは、ポートを開いた状態では変更できません。
 Flowプロパティをnone以外に設定した場合、このプロパティは、自動的にnowaitに変更されます。waitモードで利用する場合は、Openメソッドを実行する直前に、Rs.WriteMode = WriteModeValue.wait;を挿入してください。これにより、強制的にwaitモードに変更されます。ただし、この場合、相手の機器が受信可能状態になっていないと、送信がタイムアウトで中止され、フロー制御が効かないことがあります。この場合は、WriteTimeOutプロパティで、タイムアウト時間を調整してください。
WriteTimeOut 送信タイムアウト時間(ミリ秒) long 0~1000000
(デフォルト100)
送信できない場合にタイムアウトで制御を返すまでの時間です。
ただし、0の場合は、タイムアウトせず、送信の完了を待ち続けます。
このプロパティは、送信モード(WriteModeプロパティ)が「送信完了を待つ」設定の場合のみ、有効です。
このプロパティは、一般的な用途では、変更する必要はありませんが、フロー制御を行う機器との接続において、タイムアウト処理を行う場合、タイムアウト時間を長くする必要がある場合があります。
BinaryMode バイナリモード BinaryModeValue textmode
binarymode
一般的には、テキストモードを利用します。
textmode(0: テキスト)
binarymode(1: バイナリ)

例:rs232c1.BinaryMode = BinaryModeValue.textmode;
Header ヘッダ HeaderValue none
stx
none(0: なし)
stx(1: STX)

バイナリモードでは無効です。
ポーリングモードでは無効です。
詳細は下記を参照してください。
Terminator ターミネータ TerminatorValue none
etx
cr
crlf
lf
none(0: なし)
etx(1: ETX)
cr(2: CR)
crlf(3: CR+LF)
lf(4:LF)

バイナリモードでは無効です。
ポーリングモードでは無効です。
詳細は下記を参照してください。
Ver バージョン string バージョン バージョンを示します。Pro版は、文字列の最初にProが付きます。

<ヘッダ・ターミネータの意味>
この2つのプロパティは、データを受信する場合に効果があります。
ヘッダに(STX)、ターミネータに(ETX)を設定した場合の例

データが以下のように送られてきたとします。
A,B,C,(STX),D,E,F,(ETX),G,(STX),H,
この場合、Comイベントでは、A,B,CとGは破棄され、(STX),D,E,F,(ETX)がResに値として入ります。 つまり、ヘッダからターミネータまでの値がResに入ります。
また、Hは、次に(ETX)が送られるまで保持され、イベントは発生しません。 Hは、(ETX)が送られてきたときに、(STX),H,(ETX)として、Resに入り、イベントが発生します。
(注意)
 ターミネータを設定した場合、データが送られても、ターミネータが送られるまでイベントが発生しません。そのため、ターミネータが、いつまでも送られないと一時的にデータを蓄えているバッファに収まりきらなくなります。しかし、現在、バッファはメモリが許す限り確保されるため、エラーは発生しません。

メソッド
メソッド名 意味 引数値 戻り値 説明
Open()
OpenS()
ポートを開く - bool 型
正常: True
エラー: False
ポートを開き、通信を開始します。
ポートを開けない場合、falseを返します。
OpenSは、Openの特別なものです。
ライセンスキー(Password)が設定されていない場合、
Openを実行すると、シェアウェアの確認ダイアログが
表示されますが、OpenSでは、この表示はありません。
しかし、ライセンスキーが設定されていない場合、
使用期限が過ぎると使用できなくなるのは共通です。
OpenSは、試用期間中に、ダイアログ表示を行いたくない場合や、ASPでの利用の場合に、使います。
Close ポートを閉じる - - ポートを閉じます
Write(
  byte[] Data)
データの送信 送信データ bool 型
正常: true
エラー: false
Falseが返る場合、通信ポートが開かれていないか、エラーが発生しています。未送信のデータをキャンセルし、新しく送信する場合には、ClsWriteBufferを実行します。
Write(
  string Data)
データの送信 送信データ bool 型
正常: true
エラー: false
Falseが返る場合、通信ポートが開かれていないか、エラーが発生しています。未送信のデータをキャンセルし、新しく送信する場合には、ClsWriteBufferを実行します。

バイナリモードの場合
 BinaryModeプロパティをバイナリモード(binarymode)に設定した場合、バイナリデータを送信することができます。
 バイナリデータを"01fE41"のように16進数の文字列に変換して、Writeメソッドに渡すことにより、バイナリデータを送信できます。
例 Write "01fe41"
この場合、01,fe,41の3バイトが送信されます。
(注意)
00~0fまでを表すとき、最初の0を忘れずに付けてください。
"F"のように1文字の場合、0として、送信してしまいます。また、"123"とした場合、"12"までしか送信されません。
WriteB(
  byte Data)
バイトデータの送信 1バイトの送信データ bool 型
正常: true
エラー: false
このメソッドは、BinaryModeプロパティがテキストモード(textmode)でも実行できます。
ECF(
  int Mode)
通信の拡張機能 モード
Mode 機能
1 XOFF文字を受信したときのように送信を行います
2 XON文字を受信したときのように送信を行います
3 RTS信号をON
4 RTS信号をOFF
5 DTR信号をON
6 DTR信号をOFF
8 Break信号をON
9 Break信号をOFF
- 通信の拡張機能を使用します。
このメソッドは、Openを実行し、通信状態にあるときしか意味を持ちません。
ClsReadBuffer 受信バッファのクリア - - ターミネータを設定した場合、ターミネータを受信するまで、データは一時的にバッファに蓄えられます。このメソッドは、このバッファをクリアします。
ClsWriteBuffer() 送信バッファのクリア - - 送信完了を待たない設定(WriteModeが nowait)の時に有効です。
前回のWriteコマンドで送信したデータが、バッファに残っている場合、それをクリアし、新しくデータが送信できるようにします。
Wait(
 long TimeOut)
指定時間待つ ミリ秒 - 指定時間(TimeOutミリ秒)待ちます
OutBufferLen() 未送信データ長 - long 型
未送信データ長
未送信データの長さをlong型で返します。
このプロパティは、送信モード(WriteModeプロパティ)が「送信完了を待たない」設定の場合のみ、有効です。
「送信完了を待つ」設定では、0を返します。
ポーリングモード(ReadMode=pollingmode)でのみ有効なメソッド
Read() 受信データの取得 - string 型
受信データ
受信データを取得します。
テキストモードでは、受信データを文字列として取得します。
バイナリモードでは、バイナリデータを16進数文字列に変換して取得します。
InBufferLen() 受信データ長 - long 型
受信データ長
受信データの長さを返します
CommError() エラー情報の取得 - 0 エラーなし
-1 受信バッファを越えた
現在、動作しません。
このメソッドを呼び出すと、エラー値は0に初期化されます。
イベントモードでは、常に0を返します。イベントモードでは、OnErrorイベントを用いてください。

イベント
ReadModeプロパティがイベントの設定(0)の場合にイベントが発生します。
イベント名 意味 引数値 説明
Com(
 object sender,
 RecEventArgs e)
データ受信 string 型
 e.RecValue
データを受信したときに、イベントが発生し、受信したデータは、e.RecValueに入ります。
このイベント内で、長い処理を行うと、この関数を実行中に、再びイベントが発生し、動作が不安定になります。

例:危険な記述
void Func Rs1_Com(object sender, RecEventArgs e) 
{
  static i;
 for (i = 0; i < 100000; i++)
  {
    ここを実行中に、次のイベントが発生し2重に実行される可能性があります
  }
}

また、コマンド送信後の構文にブレークポイントを設定し停止させると、再開してもイベントが発生しません。
上記の例では、For文にブレークポイントを設定すると、データを受信しても、次のイベントが発生しません。

バイナリモードの場合
BinaryModeプロパティをバイナリモード(binarymode)に設定した場合、バイナリデータを受信することができます。この場合、受け取ったデータは、"01FEA0"のように、16進数で表現されます。この例では、01,FE,A0の3バイトを意味します。
ポーリングモードでは、イベントが発生しませんので、Readメソッドを使用して受信します。
Event(
 object sender,
 ComEventArgs e)
イベント発生 イベント番号 以下のイベントが発生します。
イベント番号意味
1送信完了
送信完了時に、このイベントが発生します。WriteModeプロパティを0(送信完了を待たない)に設定した場合、送信完了のタイミングを利用する場合に使用します。
OnError エラー発生 エラー番号 現在、動作しません。
エラーが起きると、イベントが発生します。
この受信バッファは、ターミネータを受信するまでのデータを蓄えておくバッファを意味します。5000バイトのバッファを越えるとエラーが発生します。
ポーリングモードでは、イベントが発生しませんので、CommErrorメソッドを使用します。


<ポーリングとイベント>
 受信の仕方をポーリングと、イベントの2つの方法から選択できます。
 イベント方式は、データが送られた場合、イベントが発生し、受信データを受け取る方法です。デフォルトは、この方式となっています。
 この方法の利点は、受信を待つループや、タイマーなどを必要とせず、また、CPUを効率的に利用できることにあります。一方で、記述する部分が、送信と受信とで分かれるため、プログラムが分かりにくくなります。また、スクリプトによってはイベントが発生しないため、受信できない場合もあります。サンプルプログラムは、この方式を利用していますので、参考にしてください。
 ポーリング方式は、シリアルポートの状態を一定時間ごとに調べる方法です。シリアル機器との通信を簡単に調べたい場合や、スクリプトがイベントを利用できない場合に利用します。

Rs.ReadMode = ReadModeValue.pollingmode;  ポーリングモードに設定
Rs.Open();  ポートのオープン
Rs.Write("SEND START");  データの送信
Rs.Wait(1000); 一定時間待つ
string Rec = Rs.Read();  データの受信
Rs.Close(); ポートのクローズ

<送信完了を待つ、待たない>
 送信時には、送信完了を待つ設定と、待たない設定があり、デフォルトでは、送信完了を待ちます。まず、次のプログラムをご覧ください。

Rs.Open(); ポートのオープン
Rs.Write("SEND START DATA1,DATA2"); データの送信
Rs.Close(); ポートのクローズ
 このコードを送信完了を待つ設定で行うと、問題なくデータは送信されます。しかし、送信完了を待たない設定の場合、データは途中で途切れる場合があります。これは、Writeコマンドが送信完了を待たずに制御を返すため、送信途中でポートが閉じられて、後のデータが送信できないためです。Rs.Open();の前に、Rs.WriteMode = WriteModeValue.nowait;を挿入するか、コンポーネントのプロパティを変更することにより、この様子を確認できます。
 送信完了を待たない設定で、このようなプログラムを記述する場合、Closeの前に、適当な待ち時間を設定するなどの工夫が必要です。
Rs.WriteMode = WriteModeValue.nowait; 送信完了を待たない(プロパティボックスで設定する場合は、この行は不要)
Rs.Open(); ポートのオープン
Rs.Write("SEND START DATA1,DATA2"); データの送信
Rs.Wait(1000); 一定時間待つ
Rs.Close(); ポートのクローズ
 送信完了を待たない設定の利点は、効率的なプログラムを記述できることにあります。送信完了までの待ち時間を他の処理に使えるわけです。上記の例では、全く意味がありませんが、プログラムの開始時にポートを開き、終了時にポートを閉じるプログラムであれば、効果があります。送信完了を待たない設定で注意が必要なのは、先に送信したデータが処理中に次のデータを送ろうとすると、エラーが発生することです。Writeが正常に実行されるまで繰り返すか、OutBufferLenが0になるのを待ってWriteを実行することで、この問題を回避できます。
 送信完了を待つ設定の場合に注意が必要なのは、フロー制御を行っている場合です。通信相手が通信を処理できずに、パソコン側が待つ状態になったとき、一定時間、プログラムが止まってみえることになります。

<送信完了を待たない場合の注意>
 次のプログラムをご覧ください。これは、正常に動作します。
 送信完了のチェック1の行をコメントにすると、データの送信2は、送信できずに、falseを返します。これは、データの送信1が完了していない間に、次の送信を行おうとしたために発生します。本コンポーネントでは、前回の送信が完了しないと、次の送信ができない仕様になっています。
 送信完了のチェック2の行をコメントにすると、データの送信1は、途中で途切れることがあります。これも、データの送信2が完了していない間に、ポートを閉じてしまうためです。


Rs.WriteMode = WriteModeValue.nowait; 送信完了を待たない設定にする
Rs.Open(); ポートのオープン
Rs.Write("SEND START DATA1,DATA2"); データの送信1
while(Rs.OutBufferLen() > 0){} 送信完了のチェック1
Rs.Write("SEND DATA3"); データの送信2
while(Rs.OutBufferLen() > 0){} 送信完了のチェック2
Rs.Close(); ポートのクローズ