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