テクセル
Rubyシリアル通信ライブラリ(Windows用)

wincom.rbは、Ruby用シリアル(RS-232C)通信ライブラリです。Windows上で動作します。
動作確認を行ったRubyのバージョン ruby 2.5.3p105 RubyInstaller x86
wincom.rbのダウンロード(wincom_v215.7z)

Serialクラス シリアル通信を行うクラスです。

■ アクセサ

1)基本

基本的内容の設定を行います。

名称 内容 初期値
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

2)デバイスコントロール

デバイスコントロール関係の設定を行います。

名称 内容 初期値
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

3)タイムアウトパラメータ

タイムアウトの指定を行います。

名称 内容 初期値
readIntervalTimeout 受信間隔タイムアウト 1000 msec
readTotalTimeoutMultiplier 受信合計タイムアウト係数 0 msec
readTotalTimeoutConstant 受信合計タイムアウト定数 0 msec
writeTotalTimeoutMultiplier 送信合計タイムアウト係数 20 msec
writeTotalTimeoutConstant 送信合計タイムアウト定数 1000 msec

タイムアウトは、以下の2種類が指定出来ます。

a) 間隔タイムアウト
受信文字間隔時間が指定された時間を超えると発生します。 受信は、「readIntervalTimeout」で指定します。送信ではサポートされてません。
b) 合計タイムアウト
送信または、受信の総時間が計算された時間を超えると発生します。
送信タイムアウト = writeTotalTimeoutMultiplier × 送信バイト数 + writeTotalTimeoutConstant
受信タイムアウト = readTotalTimeoutMultiplier × 受信バイト数 + readTotalTimeoutConstant
計算されたタイムアウト値が0の場合には、タイムアウトは使用されません。

送信タイムアウトが0の場合には、要求バイト数の送信が完了するかエラーが発生するまで送信処理が完了しません。 受信タイムアウトと間隔タイムアウトの両方が0の場合には、要求バイト数の受信が完了するかエラーが発生するまで 受信処理が完了しません。受信タイムアウトが0で間隔タイムアウトを指定した場合は、受信可能文字を読み取り 受信処理を完了します。


■ クラスメソッド

open
通信ポートをOPENします。
戻り値
正常時:nil 異常時:エラーコード
escapeCommFunc(ifunc)
通信デバイスの制御を行います。
ifunc 内容
SETXOFF XOFF 文字を受信したときのように送信を行います。
SETXON XON 文字を受信したときのように送信を行います。
SETRTS RTS( 送信要求)信号を送信します。
CLRRTS RTS( 送信要求)信号を消去します。
SETDTR DTR( データ端末準備完了)信号を送信します。
CLRDTR DTR( データ端末準備完了)信号を消去します。
RESETDEV 可能ならばリセットする (LPT デバイス)
SETBREAK ブレーク状態のセット
CLRBREAK ブレーク状態のクリア
戻り値
正常時:nil 異常時:0
close
通信ポートをCLOSEします。
戻り値
正常時:nil 異常時:0
send(schar)
文字列の送信を行います。
schar
送信文字列
戻り値
正常時:nil 異常時:0
receive
文字列の受信を行います。
戻り値
受信文字列 受信文字がない時は、nil

■ 使い方の例

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にバイト数で指定します。


履歴

2019.02 Ver.2.15 定数をクラス内に移動
2015.08 Ver.2.14 receive関数一部修正
2013.08 Ver.2.13 DCB構造体変数の型、xonLim,xoffLim変数名変更他
2013.05 Ver.2.12 ruby2.0対応
2011.07 Ver.2.11 ライブラリ「Win32api」を「dl/import」に変更
2011.05 Ver.2.0 Ruby 1.9対応
2005.05 Ver.1.0
Rubyユーティリティ
©2005-2019 TEXCELL CORPORATION