忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

VB.NET:ハンディターミナル(BHT-1300等)とのデータファイルの送受信について
以前、ハンディターミナル側から送受信を行う関数等の記事を掲載してきましたが、 ハンディターミナルの相手側としてのパソコン側のプログラムが必要になります。

パソコン側のファイル送受信用のツールがDLLの形でDENSOさんの方から提供されています。 以下の所にDENSOのURLを貼っておきますので、そちらを参照下さい。

・BHT-BASIC4.0転送ユーティリティ

このユーティリティを購入して、送受信を行うパソコンにライセンス登録が必要です。 プログラムのインストールなどは無く、必要なDLL等を実行プログラムのフォルダに登録します。 この辺りのことは購入後、取説をDENSOからダウンロードし確認してみて下さい。

■VB.NETプログラムの場合の必要なDLL

VB.NETのプログラムの実行フォルダ内に以下のDLL等が必要です。
・Bhtprtdm.dll  -- BHT-BASIC4.0 転送ユーティリティライブラリ
・Bhtprt.ini    -- BHT-BASIC4.0 転送ユーティリティライブラリ設定
・Ymodem_pd.dll -- YMODEMプロトコルライブラリ
・BHTIr_pd.dll  -- BHT-Irプロトコルライブラリ
実際の転送処理で呼出すのはBhtprtdm.dllで、その中の送受信関数(ExecProtocol)を呼出して処理をさせます。

Declare Function ExecProtocol Lib "Bhtprtdm.dll" (_
	ByVal hWnd As IntPtr, _
        ByVal Param As String, _
        ByVal FileName As System.Text.StringBuilder, _
        ByVal Protocol As Integer) As Integer
[引数]
 hWnd	 :DLLを呼び出すウィンドウハンドルを設定
 Param	 :ファイル転送の動作を制御するオプションの文字列
          (1つのファイル名と複数のオプションをスペースで区切った文字列)
 FileName:転送したパス名/ファイル名を格納
 Protocol:プロトコル番号を指定

[戻り値]
 Integer型の値で、0(Er_NOERROR)はエラー無しで、
 0以外は伝送エラー在り
 (エラー内容はDENSO提供のBASICソースを参照)

上記のほかにいろんな指定がありますが、それは各BHTの取説を見てください。
■オプションの文字列

オプション内容デフォルト
【伝送速度】
 +B
"+B9600"     9600 bps
"+B19200"   19200 bps
"+B38400"   38400 bps
"+B57600"   57600 bps
"+B115200" 115200 bps
"+B230400" 230400 bps
"+B460800" 460800 bps
YMODEM時
"+B115200"

BHT-Ir時
"+B9600"
 
【通信ポート】
 +Pn
+Pn (n = 1 ~ 99)
"+P1"
【ファイルフィールド】
 +Fn
 +F
 -F
[+Fn]の場合:"+Fa,b,c..."
 a:フィールド1桁数
 b:フィールド2桁数
 c:フィールド3桁数
 ...
[+F]の場合:既存フィールドファイルによる
  (YMODEMのみ)
 ※受信の場合はフィールドファイルを受信しない

[-F]の場合:フィールド指定なし(YMODEMのみ)
 
【伝送方向】
 +R
 -R
"+R" ファイル受信
"-R" ファイル送信
"-R"
【追加書込】
 +A
 -A
"+A" 既存データファイルに追加書込み
"-A" 追加書き込みしない
"-A"
【CR-LFの扱い】
 +C
 -C
"+C" CR-LFをデータとする
"-C" CR-LFをレコードの区切り
"-C"

オプション文字列の一般的な例としては以下の様になります。
送信の場合:"TEST.DAT +P5 +F16,12 -R"
受信の場合:"TEST.DAT +P5 +F16,12 +R"
この場合、YMODEMでの伝送を想定していて、 通信ポートはパソコンにUSB-COMポートをインストールした時に COM5 になったので"P5"としています。
また、フィールド指定は以下の記事のデータファイルを使っています。
・BHT-BASIC4.0:データファイルの取り扱いについてその2(書込み・読込みの実用的な関数)


■VB.NETの送受信テストプログラム

上記のオプション例を使った簡単なVB.NETのテストプログラムを以下に示します。
Module Module1
    Declare Function ExecProtocol Lib "Bhtprtdm.dll" ( _
        ByVal hWnd As IntPtr, _
        ByVal Param As String, _
        ByVal TransferFileName As System.Text.StringBuilder, _
        ByVal ProtocolType As Integer) As Integer
End Module

Public Class Form1
    '送信処理ボタン
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            Const PRTCL_YMODEMBATCH As Short = 2
            Dim iRet As Integer
            Dim strFile As System.Text.StringBuilder = New System.Text.StringBuilder
            Dim strOption As String
            'オプションの編集
            strOption = "TEST.DAT +P5 +F16,12 -R"   '"-R"送信
            'ファイル転送
            iRet = ExecProtocol(Me.Handle, strOption, strFile, PRTCL_YMODEMBATCH)
            '戻り値のチェック
            If iRet <> 0 Then
                MsgBox("Err Code = " & iRet.ToString() & " : File[" & strFile.ToString() & "]")
            Else
                MsgBox("送信OK...File[" & strFile.ToString() & "]")
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub

    '受信処理ボタン
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Try
            Const PRTCL_YMODEMBATCH As Short = 2
            Dim iRet As Integer
            Dim strFile As System.Text.StringBuilder = New System.Text.StringBuilder
            Dim strOption As String
            'オプションの編集
            strOption = "TEST.DAT +P5 +R"   '"+R"受信
            'ファイル転送
            iRet = ExecProtocol(Me.Handle, strOption, strFile, PRTCL_YMODEMBATCH)
            '戻り値のチェック
            If iRet <> 0 Then
                MsgBox("Err Code = " & iRet.ToString() & " : File[" & strFile.ToString() & "]")
            Else
                MsgBox("受信OK...File[" & strFile.ToString() & "]")
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
End Class

フォームの画面表示は以下の感じです。 送信ボタンと受信ボタンをフォームに配置しそれぞれのボタンクリックで送受信処理を行っているだけです。 受信時のオプションはフィールド指定が無い違いがあります。


■BHT-BASICの送受信テストプログラム(ハンディ側)

ハンディターミナル側の簡単な受信・送信テストプログラムを以下に示します。
'---------------------------------------
'ファイル送信
'---------------------------------------
'Function GfSndFile%(pintFp%, pstrSpeed$, pstrFile$, pstrOption$)
'引 数:
'	pintFp%		:ファイル番号
'	pstrSpeed$	:送信スピード
'	pstrFile$	:送信ファイル名
'	pstrOption$	:送信オプション
'戻り値:
'	GfSndFile%	:送信OK(GcTrue%)NG(GcFalse%)
'---------------------------------------
	Function GfSndFile%(pintFp%, pstrSpeed$, pstrFile$, pstrOption$)
		On Error Goto GfSndFile.ErrProc
		OPEN "COM1:" + pstrSpeed$ AS pintFp%
		XFILE pstrFile$, pstrOption$
		GfSndFile% = GcTrue%
GfSndFile.Return		'終了処理
		CLOSE pintFp%
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
GfSndFile.ErrProc
		GfSndFile% = GcFalse%
		Resume GfSndFile.Return
	End Function

'---------------------------------------
'ファイル受信
'---------------------------------------
'Function GfRcvFile%(pintFp%, pstrSpeed$, pstrFile$, pstrOption$)
'引 数:
'	pintFp%		:ファイル番号
'	pstrSpeed$	:受信スピード
'	pstrFile$	:受信ファイル名
'	pstrOption$	:受信オプション("R")以外のオプション
'戻り値:
'	GfRcvFile%	:受信OK(GcTrue%)NG(GcFalse%)
'---------------------------------------
	Function GfRcvFile%(pintFp%, pstrSpeed$, pstrFile$, pstrOption$)
		On Error Goto GfRcvFile.ErrProc
		OPEN "COM1:" + pstrSpeed$ AS pintFp%
		OUT &h6060, 3	'YMODEM
		XFILE pstrFile$, "R" + pstrOption$
		GfRcvFile% = GcTrue%
GfRcvFile.Return		'終了処理
		CLOSE pintFp%
		On Error Goto 0
		Exit Function
'-----
'エラー処理
'-----
GfRcvFile.ErrProc
		GfRcvFile% = GcFalse%
		Resume GfRcvFile.Return
	End Function

'---------------------------------------
'メイン処理開始
'---------------------------------------
	SCREEN 1				'漢字モード
	LOCATE , , 2			'カーソルをブロック表示
	PRIVATE intRet%
	PRINT "受信開始:";
	intRet% = GfRcvFile%(1, "115200", "TEST.DAT", "PTM") '受信
	PRINT "GfRcvFile%=" + STR$(intRet%)
	WAIT 0, &h01 'キー入力待ち
	PRINT "送信開始:";
	intRet% = GfSndFile%(1, "115200", "TEST.DAT", "PTM") '送信
	PRINT "GfSndFile%=" + STR$(intRet%)
	WAIT 0, &h01 'キー入力待ち
	END

■VB.NETの送受信テストプログラムの実行
送信時の画面は、以下の様にYMODEM送信のダイアログが表示されて、 件数の様な数字がカウントアップします。

送信処理後に、 TEST.DAT の存在するフォルダを確認すると  TEST.FLD ファイルが作られているのがわかります。 この TEST.FLD ファイルの内容は以下の様にフィールドの定義ファイルの様です。
* created by BHT-BASIC 4.0 Transfer Utility DLL Version 1.14
*   Copyright (C) DENSO WAVE INC. 2001-2013 all rights reserved
file	TEST.DAT
fields	16 12
受信時の画面は、以下の様な表示になります。

受信後は、ハンディから送られてくる TEST.FLD ファイルが生成される様です。 以下はその内容です。
* created by BHT
file	TEST.DAT
size	150
records	5
fields	16 12




=====
2016/04/02:の時の情報











PR

コメント

コメントを書く