wincom.rbは、Ruby用シリアル(RS-232C)通信ライブラリです。Windows上で動作します。
動作確認を行ったRubyのバージョン ruby 2.5.3p105 RubyInstaller x86
wincom.rbのダウンロード(wincom_v215.7z)
Serialクラス シリアル通信を行うクラスです。
基本的内容の設定を行います。
名称 | 内容 | 初期値 |
---|---|---|
comno | 通信ポートNo. 1~ | 1 |
bRate | 通信速度 CBR_110,CBR_300,CBR_600,CBR_1200,CBR_2400, CBR_4800,CBR_9600,CBR_14400,CBR_19200,CBR_38400,CBR_57600, CBR_115200,CBR_128000,CBR_256000 のいずれか |
CBR_9600 |
byteSize | 1文字長 4,5,6,7,8 のいずれか | 8 |
parity | パリティ EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY,SPACEPARITY のいずれか | NOPARITY |
stopbit | ストップビット ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS のいずれか | ONESTOPBIT |
recbuf | 受信バッファサイズ(バイト) | 512 |
senbuf | 送信バッファサイズ(バイト) | 512 |
errorchar | エラー時の置換文字 | 0x00 |
xonchar | XON文字 | 0x11(D1) |
xoffchar | XOFF文字 | 0x13(D3) |
XonLim | XON上限値 | 0 |
XoffLim | XOFF下限値 | 0 |
デバイスコントロール関係の設定を行います。
名称 | 内容 | 初期値 |
---|---|---|
fBinary | バイナリィモード 0:無効 1:有効 Win32apiでは、常に1:有効とします。 | 1 |
fParity | パリティチェック 0:無効 1:有効 | 1 |
fOutxCtsFlow | CTS出力フロー制御 0:無効 1:有効(CTS信号の監視を行う) | 1 |
fOutxDsrFlow | DSR出力フロー制御 0:無効 1:有効(DSR信号の監視を行う) | 1 |
fDtrControl | DTRフロー制御の種類 DTR_CONTROL_DISABLE(無効) DTR_CONTROL_ENABLE(有効) DTR_CONTROL_HANDSHAKE(ハンドシェイク) |
DTR_CONTROL_ENABLE |
fDsrSensitivity | DSR信号の状態を検出できるかどうかを指定 0:無効 1:DSR信号がオンの時のみ受信文字を取り込む |
1 |
fTXContinueOnXoff | 受信時にXOFF文字送信後、こちら側の送信を継続するか停止するかの指定。 0:しない 1:こちら側の送信を継続する | 0 |
fOutX | 送信時のXON/XOFFフロー制御の有効、無効を指定 0:無効 1:有効 | 0 |
fInX | 受信時のXON/XOFFフロー制御の有効、無効を指定 0:無効 1:有効 | 0 |
fErrorChar | エラーによる置換の有効、無効を指定 0:無効 1:有効 | 0 |
fNull | ヌル文字の廃棄有効無効 0:無効 1:有効(1でヌル文字無効) | 0 |
fRtsControl | RTSフロー制御の種類 RTS_CONTROL_DISABLE:無効, RTS_CONTROL_ENABLE:有効 RTS_CONTROL_HANDSHAKE:送信バッファ半分以下でRTSハイ,4分の3以上でロー RTS_CONTROL_TOGGLE:送信文字ありでRTS信号ハイ、なしでロー |
RTS_CONTROL_ENABLE |
fAbortOnError | エラー時に読み取り書き込みを中止するかの指定 0:中止しない 1:中止する | 0 |
タイムアウトの指定を行います。
名称 | 内容 | 初期値 |
---|---|---|
readIntervalTimeout | 受信間隔タイムアウト | 1000 msec |
readTotalTimeoutMultiplier | 受信合計タイムアウト係数 | 0 msec |
readTotalTimeoutConstant | 受信合計タイムアウト定数 | 0 msec |
writeTotalTimeoutMultiplier | 送信合計タイムアウト係数 | 20 msec |
writeTotalTimeoutConstant | 送信合計タイムアウト定数 | 1000 msec |
タイムアウトは、以下の2種類が指定出来ます。
送信タイムアウトが0の場合には、要求バイト数の送信が完了するかエラーが発生するまで送信処理が完了しません。 受信タイムアウトと間隔タイムアウトの両方が0の場合には、要求バイト数の受信が完了するかエラーが発生するまで 受信処理が完了しません。受信タイムアウトが0で間隔タイムアウトを指定した場合は、受信可能文字を読み取り 受信処理を完了します。
ifunc | 内容 |
SETXOFF | XOFF 文字を受信したときのように送信を行います。 |
SETXON | XON 文字を受信したときのように送信を行います。 |
SETRTS | RTS( 送信要求)信号を送信します。 |
CLRRTS | RTS( 送信要求)信号を消去します。 |
SETDTR | DTR( データ端末準備完了)信号を送信します。 |
CLRDTR | DTR( データ端末準備完了)信号を消去します。 |
RESETDEV | 可能ならばリセットする (LPT デバイス) |
SETBREAK | ブレーク状態のセット |
CLRBREAK | ブレーク状態のクリア |
2台のパソコンをRS232Cシリアルケーブル(クロスケーブル)で接続し通信を行います。
1台目のパソコンで下記のrubyプログラムを実行します。2台目のパソコンではターミナルソフトRLoginを使用します。
RLoginで文字入力を行い「Enter」キーで文字列を送信します。rubyプログラムでは、受信データを表示し、
受信文字にLF文字を追加し送信を行います。qキー入力で終了します。実行にはwinconsが必要です。
通信設定は、9600BPS、データ長8ビット、パリティなし、1ストップビット、フロー制御RTS/CTSとします。
RLoginでの設定については、こちらを参照して下さい。
# coding: utf-8
# wincom 通信テスト RLoginと通信
require "./wincom"
require "./wincons"
consl = Console.new(__ENCODING__)
compt = Serial.new
compt.comno = 1 # comポート番号
compt.bRate = Serial::CBR_9600
compt.byteSize = 8
compt.parity = Serial::NOPARITY
compt.fDtrControl = Serial::DTR_CONTROL_DISABLE
ir = compt.open
if ir == nil
ir = compt.escapeCommFunc(Serial::SETDTR)
else
compt.close
print "通信ポートオープン失敗\r\n"
exit
end
print "通信ポートオープン¥r¥n"
irstep = 1
srcvdt = nil
while true do
sr = compt.receive
if sr != nil
sr.each_byte do |c|
ic = c.to_i
if irstep == 1 && srcvdt == nil
srcvdt = c.chr
irstep = 2
else
if irstep == 2
srcvdt += c.chr
if ic == 0x0d #CR
print "受信:" + srcvdt + "¥n"
compt.send(srcvdt + "¥n")
print "送信:" + srcvdt + "¥n"
srcvdt = nil
irstep = 1
break
end
end
end
end
end
ca, = consl.inkey
if ca == "q" || ca == "Q"
break
end
end
compt.close
print "通信ポートクローズ¥r¥n"
フロー制御について
受信バッファの満杯、あふれ状態を防止するため送信機器と取り合いを行います。以下の3通りの方法があります。
1)RTS/CTSフロー制御
RTS信号(Request to send:送信要求)とCTS信号(Clear to send:受信可)を使用します。
データ送信時は、RTSをONとします。受信側はこの信号がONとなった場合、受信バッファに余裕があり受信可能であればCTSをONとします。
送信側は、fOutxCtsFlowフラグが有効の場合CTS信号の監視を行います。また、送信側のRTSフロー制御はfRtsControlフラグの内容
に従い行われます。
2)DTR/DSRフロー制御
通常DTR/DSRフロー制御はパソコンとモデム間のフロー制御です。DTR信号(Data terminal ready)とDSR信号(Data set ready)を
使用します。パソコン側では、通信開始前にDTR信号をONとします。モデム側は、受信バッファに余裕があり受信可能であれば
DSR信号をONとします。
パソコン側は、fOutxDsrFlowフラグが有効の場合DSR信号の監視を行います。また、パソコン側のDTRフロー制御は、
fDTRControlフラグの内容に従い行われます。
fDsrSensitivityは、DSR信号の状態を検出できるかどうかを指定します。ONの時は、DSR信号がONの時受信を行います。
fErrorCharフラグは、パリティエラー発生時の文字置換の有効無効を指定します。置換文字は、errorcharで指定します。
3)XON/XOFFフロー制御
受信バッファが指定バイト数以上になると送信側にXOFF文字を送信し、指定バイト数以下になるとXON文字を送信します。
fOutXフラグがONの時、送信時のXON/XOFFフロー制御が有効となります。また、fInXフラグがONの時は、受信時のXON/XOFF
フロー制御が有効となります。
fTXContinueOnXoffフラグがONの時は、受信時XOFF文字送信後も送信を継続します。
XON/XOFFの文字は、xonchar,xoffcharで指定します。通常xoncharは、0x11、xoffcharは、0x13です。
受信バッファの上下限値は、XonLim、XoffLimにバイト数で指定します。
履歴