NonSoft

コマンドラインでRS232C(シリアル)通信する方法


 ち〜な〜み〜に〜
新しいRS232C(シリアル)の機器がある時、とりあえず簡単なプログラムを作ってテストしてみたいと考えるかもしれません。
しかし、簡単なプログラムといってもRS232C(シリアル)のプログラム作成は面倒かもしれません。
そんな時に便利な、コマンドライン(バッチファイル)でRS232C(シリアル)通信するツールがありますので紹介します。

コマンドライン通信(RS232C)はコマンドライン(バッチファイル)でシリアル(RS232C)の送受信(DTRやRTSの制御可)するツールです。

簡単な例では以下の4行で電文の送受信が出来ます。
SendRs232c.exe "@OPEN@@@@@,%PORT%,9600,8,0,0,0"
SendRs232c.exe -t2b "<STX>1234567890<ETX>"
RecieveRs232c.exe 10 60
SendRs232c.exe "@CLOSE@@@@"

コマンドラインツールなので受信電文のチェック処理や繰り返し処理もコマンドプロンプトのIF文やGOTO文でプログラミング出来ます。
特別な送受信処理が必要な場合は、その特別な部分(EXE等) を自作する事で実現可能です。

まずは、COMポート2つをクロスケーブルで接続し、SampleMain.batを実行してみてください。
シリアル(COM)ポートが無い場合は 仮想シリアル(COMポート)ドライバ をおすすめします。

<関連ツール>
スクリプト通信テスト(RS232C/TCPIP/UDPIP)
スクリプト(VBS)を使用した簡単!! 通信テスト!! 対象プロトコルはRS232C、TCP/IP、UDP/IP!!
EXCEL通信テスト(RS232C/TCPIP/UDPIP)
EXCEL(VBA)を使用した簡単!! 通信テスト!! 対象プロトコルはRS232C、TCP/IP、UDP/IP!!

★コマンドライン通信(RS232C)のサンプルBATプログラム・メイン(SampleMain.bat)
ECHO OFF
ECHO **********************************
ECHO *       コマンドライン通信(RS232C)のサンプル       *
ECHO *このサンプルはCOMポートを2つ使用します。2つのCOMポートは*
ECHO *クロスケーブルで接続されている必要があります。COMポート2つと*
ECHO *クロスケーブルを準備出来ない時は、下のURLで紹介している仮想の*
ECHO *シリアル(COMポート)ドライバ(フリー)を使用すると良いでしょう。*
ECHO *URL:http://nonsoft.la.coocan.jp/Link/Null-Modem.html   *
ECHO **********************************
ECHO 準備が宜しければEnterキーを押してください。
ECHO 中止する場合はCTRL−Cキーで終了してください。
PAUSE

REM ==ディレクトリの準備===============================================
IF NOT EXIST PORT2 (
XCOPY /E /I PORT1 PORT2
)

REM ==サーバー側のサンプル実行=========================================
START SampleSub.bat 1

REM ==クライアント側のサンプル実行=====================================
START SampleSub.bat 2

★コマンドライン通信(RS232C)のサンプルBATプログラム・サブ(SampleSub.bat)
ECHO OFF
ECHO **********************************
ECHO *       コマンドライン通信(RS232C)のサンプル       *
ECHO *このサンプルはCOMポートを2つ使用します。2つのCOMポートは*
ECHO *クロスケーブルで接続されている必要があります。COMポート2つと*
ECHO *クロスケーブルを準備出来ない時は、下のURLで紹介している仮想の*
ECHO *シリアル(COMポート)ドライバ(フリー)を使用すると良いでしょう。*
ECHO *URL:http://nonsoft.la.coocan.jp/Link/Null-Modem.html   *
ECHO **********************************
IF "%1%" NEQ "1" (
IF "%1%" NEQ "2" (
ECHO ...
ECHO 起動引数が誤っています。
ECHO SampleSub.batを直接実行せず、SampleMain.batを実行してください。
ECHO ...
PAUSE
EXIT
))

REM ==開始=============================================================
REM 引数が1で起動された時はPORT1ディレクトリへ移動
IF "%1%" NEQ "2" (CD PORT1)
REM 引数が2で起動された時はPORT2ディレクトリへ移動
IF "%1%" EQU "2" (CD PORT2)

REM ==オープン=========================================================
REM このサンプルは引数が1で起動された時はCOM11を使用します
REM このサンプルは引数が2で起動された時はCOM12を使用します
IF "%1%" NEQ "2" (SET PORT=COM11) ELSE (SET PORT=COM12)
ECHO %PORT%をオープンします。
REM オープンするとバックグラウンドプロセスがタスクトレイで起動されます
REM 引数説明:@OPEN@@@@@,COMX,BaudRate,ByteSize,StopBits,Parity,XonOff
REM @OPEN@@@@@=COMポートオープン命令(固定)
REM COMX      =COMポート名(COM1,COM2,COM3...)
REM BaudRate  =通信速度(9600,19200,38400...)
REM ByteSize  =バイトのビット数(4,5,6,7,8)
REM StopBits  =ストップビット数(1ビット=0,1.5ビット=1,2ビット=2)
REM Parity    =パリティ(無し=0,奇数=1,偶数=2,マーク=3,スペース=4)
REM XonOff    =XON/XOFF(無し=0,有り=1)
SendRs232c.exe "@OPEN@@@@@,%PORT%,9600,8,0,0,0"

REM 通信相手の初期化待ちのため2秒間スリープ
SleepRs232c 2.0

REM このサンプルは10回の送受信を繰り返します
SET LOOP_MAX=10
SET LOOP_CNT=0
:LOOP
SET /A LOOP_CNT=%LOOP_CNT% + 1
ECHO ----------%LOOP_CNT%回目の送受信----------

REM ==ログ開始=========================================================
REM 送受信データをlogディレクトリに保存するモードの開始指令
SendRs232c.exe "@LOG_ST@@@"

REM ==送信=============================================================
REM 引数が1で起動された時は受信処理からスタート
REM 引数が2で起動された時は送信処理からスタート
IF "%1%" EQU "2" (
REM RTSをONします
SendRs232c.exe "@SETRTS@@@"
REM DTRをOFFします
SendRs232c.exe "@CLRDTR@@@"
REM 電文を送信します
REM -t2b:<STX>,<ETX>,<F0>等をバイナリ変換
REM -f:ファイル指定
SendRs232c.exe -t2b "<STX>1234567890<ETX>"
)

REM ==受信=============================================================
REM 10バイトの電文を受信するまで待ちます(60でタイムアウトする指定)
RecieveRs232c.exe 10 60

REM 受信タイムアウトチェック
IF ERRORLEVEL 1 (
SET ERRMSG=受信タイムアウトしました。ERRCODE=101
GOTO ERR)

REM 受信データを取得する環境変数を初期化
SET RCVDAT=
SET RCVCTS=
SET RCVDSR=
SET RCVRING=
SET RCVRLSD=

REM 受信した電文の2バイト目から10バイト(文字列)を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -dat 2 10') DO SET RCVDAT=%%i
REM CTSの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -cts') DO SET RCVCTS=%%i
REM DSRの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -dsr') DO SET RCVDSR=%%i
REM RINGの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -ring') DO SET RCVRING=%%i
REM RLSDの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -rlsd') DO SET RCVRLSD=%%i

REM 結果表示
ECHO %RCVDAT%,CTS=%RCVCTS%,RTS=%RCVDSR%,RING=%RCVRING%,RLSD=%RCVRLSD%

REM 受信電文の値(文字列)チェック
IF "%RCVDAT%" NEQ "1234567890" (
SET ERRMSG=受信電文が誤っているため異常終了しました。ERRCODE=201
GOTO ERR)

REM 受信した電文の2バイト目から5バイト(HEX)を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -dat 2 5 hex') DO @SET RCVDAT=%%i

REM 結果表示
ECHO %RCVDAT%,CTS=%RCVCTS%,RTS=%RCVDSR%,RING=%RCVRING%,RLSD=%RCVRLSD%

REM 受信電文の値(HEX)チェック
IF "%RCVDAT%" NEQ "3132333435" (
SET ERRMSG=受信電文が誤っているため異常終了しました。ERRCODE=202
GOTO ERR)

REM 処理済み受信電文削除
DEL /F /Q rcv\*.dat

REM ==送信=============================================================
REM 引数が1で起動された時の送信処理
IF "%1%" NEQ "2" (
REM RTSをONします
SendRs232c.exe "@SETRTS@@@"
REM DTRをOFFします
SendRs232c.exe "@CLRDTR@@@"
REM 電文を送信します
REM -t2b:<STX>,<ETX>,<F0>等をバイナリ変換
REM -f:ファイル指定
SendRs232c.exe -t2b "<STX>1234567890<ETX>"
)

REM 引数が2で起動された時の送信処理
IF "%1%" EQU "2" (
REM RTSをOFFします
SendRs232c.exe "@CLRRTS@@@"
REM DTRをONします
SendRs232c.exe "@SETDTR@@@"
REM ファイルを指定して電文を送信します
REM -t2b:<STX>,<ETX>,<F0>等をバイナリ変換
REM -f:ファイル指定
SendRs232c.exe -t2b -f "dat\test.dat"
)

REM ==受信=============================================================
REM 10バイトの電文を受信するまで待ちます(60でタイムアウトする指定)
RecieveRs232c.exe 10 60

REM 受信タイムアウトチェック
IF ERRORLEVEL 1 (
SET ERRMSG=受信タイムアウトしました。ERRCODE=102
GOTO ERR)

REM 受信データを取得する環境変数を初期化
SET RCVDAT=
SET RCVCTS=
SET RCVDSR=
SET RCVRING=
SET RCVRLSD=

REM 受信した電文の2バイト目から10バイト(文字列)を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -dat 2 10') DO SET RCVDAT=%%i
REM CTSの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -cts') DO SET RCVCTS=%%i
REM DSRの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -dsr') DO SET RCVDSR=%%i
REM RINGの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -ring') DO SET RCVRING=%%i
REM RLSDの値を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -rlsd') DO SET RCVRLSD=%%i

REM 結果表示
ECHO %RCVDAT%,CTS=%RCVCTS%,RTS=%RCVDSR%,RING=%RCVRING%,RLSD=%RCVRLSD%

REM 受信電文の値(文字列)チェック
IF "%RCVDAT%" NEQ "ABCDEFGHIJ" (
SET ERRMSG=受信電文が誤っているため異常終了しました。ERRCODE=203
GOTO ERR)

REM 受信した電文の2バイト目から5バイト(HEX)を環境変数に取得します
FOR /F %%i IN ('CheckRs232c.exe -dat 2 5 hex') DO @SET RCVDAT=%%i

REM 結果表示
ECHO %RCVDAT%,CTS=%RCVCTS%,RTS=%RCVDSR%,RING=%RCVRING%,RLSD=%RCVRLSD%

REM 受信電文の値(HEX)チェック
IF "%RCVDAT%" NEQ "4142434445" (
SET ERRMSG=受信電文が誤っているため異常終了しました。ERRCODE=204
GOTO ERR)

REM 処理済み受信電文削除
DEL /F /Q rcv\*.dat

REM ==送信=============================================================
REM 引数が1で起動された時の送信処理
IF "%1%" NEQ "2" (
REM RTSをOFFします
SendRs232c.exe "@CLRRTS@@@"
REM DTRをONします
SendRs232c.exe "@SETDTR@@@"
REM ファイルを指定して電文を送信します
REM -t2b:<STX>,<ETX>,<F0>等をバイナリ変換
REM -f:ファイル指定
SendRs232c.exe -t2b -f "dat\test.dat"
)

REM ==ログ終了&削除===================================================
REM 送受信データをlogディレクトリに保存するモードの終了指令
SendRs232c.exe "@LOG_ED@@@"

REM logディレクトリに保存したデータの削除
DEL /F /Q log\*.dat

REM ==繰り返し=========================================================
REM このサンプルは複数回の送受信を繰り返します
IF %LOOP_CNT% LSS %LOOP_MAX% GOTO LOOP

REM ==クローズ=========================================================
REM クローズするとバックグラウンドプロセスが終了します
SendRs232c.exe "@CLOSE@@@@"

ECHO 正常終了しました。
GOTO END

REM ==エラー===========================================================
:ERR
REM エラーの時もクローズします
SendRs232c.exe "@CLOSE@@@@"

REM エラーメッセージ表示
ECHO %ERRMSG%

REM ==終了=============================================================
:END

REM コマンドプロンプトを自動で閉じないようにポーズします
PAUSE