VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 2005/07/26(Tue) 10:20
投稿者チロル
Eメール
URL
タイトルRe^3: MSCommのOn_Comm受信

G13さん Starfishさん 追加アドバイス有難うございます。
受信フォーマットの関しG13さんの推測はほとんど正解です。
まず、このプログラムは1台のホストコンピュータに対し複数の従属局が付くことになっています。
とは言うものの、このプログラムはメインではなく、デバック用のツールのような、社内で鑑定するた
めのプログラムです。
当方まだ、始めたばかりであり、これが初案件的なものになります。
参考のためにいくつか質問して頂いていますが、的外れな回答をしてしまったら申し訳ございません。
私の知識範囲の限り回答したいと思います。

Function initialize()
   ' 制御コード初期化
    With COMM_CODE
        .STX = &H2
        .ETX = &H3
        .ENQ = &H5
        .ACK = &H6
        .DLE = &H10
        .NAK = &H15
        .POL = &H70
        .SEL = &H71
        .RSP = &H72
        .HA = &H80
    End With
End Function
ここまでは固定長のものです。

可変長は UA  DLNGH  DLNGL  BCC の四つになります。
UA:従属局のアドレス
DLNGH:TEXTデータ(最大2000)の上二桁の値になります
DLNGL:TEXTデータ(最大2000)の下二桁の値になります
BCC:DLE DLNGH DEL DLNGL TEXTデータ DLE ETX がBCCの計算対象範囲となっています。

>*1:ポーリングに対する応答か否定応答(NAK)を判別する種別コード見ないな感じですか?。
おっしゃる通りです。ポーリングに対しNAKかレスポンスを返す仕様となっています。
また、レスポンスの作りはセレクティングと酷似しています
参考:
ポーリング DEL POL DLE HA DLE UA という6バイト固定の構造です。
他にACK NAK ENQ などありますが、2バイト目のPOLの箇所が ACK NAK ENQ と置き換えるだけで別コマン
ドとしています。
セレクティングとレスポンス
セレクティング DEL SEL DLE HA DLE UA DLE DLNGH DEL DLNGL TEXTデータ DLE ETX (DLE)BCC
という構造です。最後のBCCの前のDLEが()で括られている理由はBCCが10のときはDLEを付加するという
仕様のためです。
レスポンスに関して、6バイトの固定コマンドと同じように2バイト目をRSPに置き換えることで別コマ
ンドとしています。

>*2:データ長の算出開始位置ですか?
上記記載
>*3:データ長(High/Low)は、どこからどこまでの長さが指定されていますか?。
上記記載
>*4:フレームの最終を示すコードですか?
構造は上記に記載した通りなのですが・・・最終を示すのはETXかBCCなのでしょうが、私にはどちらが
最終フレームとして扱って良いかわかりません。最後についているという単純な意味合いでBCCだと認識
していました。
>*5:BCCは、どこからどこまでをどう計算した値ですか?
上記記載

>送るのが、NAKとセレクティングですか?又、セレクティングにデータが引っ付いている
>のですか?どんなプロトコルですか?
種類と省略兼ねてNAKとセレクティングを挙げましたが実際は上記記載のようにいくつか存在します。
上記の説明で先回答となってしまいます。
プロトコルに関して、的外れになる予感がしますが、そもそもこのプロジェクト名が「××(社名)プ
ロトコル」なのです。
そのプロトコル仕様書に沿って作っている感じです。

>NAKとかセレクティングって、普通コマンドボタンからいきなり送信するって
>普通ないですよね?テストプログラムなの?
上記の通り、客先ではなく、メインでプログラムを書いている方は別に存在し、その方のデバック用の
ツールとして作成しているため
「手動でもコマンドを投げれるように」との指示の元作成しています。

>COMM_CODE.DLNGH って、バイト型の変数だと思うんですが、文字列をセット
>していますね。VAL関数とかで、数値に変換してから代入しましょう。
有難うございます。まさにその通りで、特定の処理のときはツジツマが合いましたがパターンを変える
とダメになっていました。
なんとか、原因をつきとめれたのですが、まさに指摘されている箇所でした。

>データに、DLEがあったら、DLE+DLEにしていますよね。その場合に、
>データ長は増やさないのですか?増やさない場合は、受信側が単純に
>DLNGH・DLNGLからデータの長さがわからないので、受信側が面倒にな
>りますね。
仕様上テキストデータ内に&H10(DLE)と同じものがあった場合、次に来る値も&H10(DLE)と
二つ連な
って初めて1バイトの&H10として認識させる仕様になっています。
これは従属局がマイコンになる予定があるらしく、そういった透過処理が必要になるみたいです。
受信側も少し工夫がいると言われているので、これは仕様のようです。(自分ではまだわかっていな
く、「みたい」とか「のようだ」の表現が多く申し訳ありません。)

>データに、DLEがあったら、DLE+DLEにしていますよね。その場合に、
>データ長は増やさないのですか?
これは加算しないようです。受信側でも加算されたものを減算させ真の値と扱うようです。

>変な仕様ですね、これでは文字化けしててもチェックできませんね。又、文字列を
>セットしているし、データ長が大きいとオーバフローしそうですね。
おっしゃる通りオーバーフローしました。bufLenに関しても指摘通りで1多かったです。
本当・・・間違いだらけですみません。。。orz

と、回答できるものは以上です。
現在は頂いたアドバイスと併用で一つずつ、試行錯誤しています。
上手くまとまれば、報告したいと思うので、追加アドバイスあれば、どうかよろしくお願いします。


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -