C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: シリアル通信 受信コマンド VB2008


(過去ログ 126 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■75120 / inTopicNo.1)  シリアル通信 受信コマンド VB2008
  
□投稿者/ ガッキー (6回)-(2015/02/28(Sat) 16:25:53)

分類:[VB.NET/VB2005 以降] 

 前回、No75068でシリアル送信コマンドについて質問させて頂きました。
 今回は、前回の続きで受信の方で質問なのですが、
 
【接続構成】
 PC-----→A基板-----→B基板
 ↑←-------------------↓

 PC-A基板(USB)
 A基板-B基板(LAN)
B基板-PC(USB)

 現在上のような環境で、PCからデータを送信→A基板→B基板を経由してPCで受信するというものを作ろうとしています。
 B基板にデータが送られた時、レスポンスコマンドが発行され、PCで受信します。

【仕様】
 レスポンスコマンドの仕様は
    @STX(HEX)02Hで固定
    ANode No(HEX)B基板の番号(30H 30H)
    BSub Add(HEX)B基板の番号(30H 30H)
    CEnd Code(HEX)終了コード(正常なら30H 30H、それ以外ならエラー)
    DMRC(HEX)30Hで固定
    ESRC(HEX)30Hで固定
    FResCode(HEX)レスポンスコード(正常なら30H 30H 30H 30H、それ以外ならエラー)
    GReadData(HEX)35H 35H
    HEXT(HEX)03Hで固定
    IBCC(HEX)A〜Hまでの値を利用
 これらをまとめたデータ
    [@STX]+[ANode No]+[BSub Add]+[CEnd Code]+[DEFGFINE]+[HEXT]+[IBCC]
 となっております。
 
 レスポンスコマンドをPC側で受信した際の処理として、
   STEP1:受信したレスポンスコマンドの先頭が02H(STX)であれば、IのBCCまでデータを受信し、A〜HまでのBCCの計算を行う。
   STEP2:CのEnd Codeが30H 30H以外ならエラー処理("終了コードが異常です"の表示)
   STEP3:FのResCodeが30H 30H 30H 30H以外ならエラー処理("レスポンスコードが異常です"の表示)
   STEP4:GのデータをASCUの55に変換→55(16進数)を10進数に変換して10を掛ける。
   STEP5:受信したBCCと計算したBCCが同じなら、STEP4の計算結果を表示する。

 上記のような処理を行いたいのですが、これらをコード上で表現する際、

【Q1】
   STEP1:レスポンスコマンドを配列に格納する(Byte型?)
        配列の0番目にSTXを代入(SerialPortのReadメソッド)し、if文で判定を行う(配列の0番目=02H)
        if文の判定が真なら、Readメソッドで残りのデータを配列に代入する。
        BCC計算用の変数を宣言し、計算結果を格納する。
   STEP2:if文で判定し、偽だった場合MsgBoxを使用する。
   STEP3:STEP2と同じ
   STEP4:受信したデータ(ASCUの35H 35H)をString(Hex関数?)に一度変換し、そこからint型に変換して10を掛ける。
   STEP5:if文の判定で真なら、MsgBoxを使用して、STEP4の結果を表示する。

 という考えなのですが、上記の考えで出来ますでしょうか。

【Q2】
 コマンド/レスポンス方式の通信に関しての確認なのですが、
 コマンド/レスポンス方式の通信では、送信データに対してレスポンス側(今回でいうB基板)が送信データを受け取った際に、
 レスポンスコードを発行(機器によってコードの仕様は異なる)し、それを送信元(PC)にデータを返答するという認識であっていますでしょうか。

長くなりましたが、以上です。
まとまりがなくて、非常にわかり辛いかもしれませんが、ご指摘等頂けますでしょうか。
よろしくお願いします。

引用返信 編集キー/
■75129 / inTopicNo.2)  Re[1]: シリアル通信 受信コマンド VB2008
□投稿者/ 774RR (229回)-(2015/03/02(Mon) 17:57:24)
Q2 だいたいその理解であってる
USB2.0 なんかもそういうロジックで
・積極的に送信を開始する機器 (Host) が「コマンド」を送る
・何か通信されたら返事を返す機器 (Function) が「レスポンス」を返す(こういう機器は自発的に送信しない)

普通はコストの問題で「コマンド」と「レスポンス」は同じ通信ポートを使うので
提示例「コマンドを受け取るポート」と「レスポンスを返すポート」が違うような機器構成はレア
# ってか俺はいまだかつて一度も見たことが無い構成だ。
普通の構成で「コマンド+レスポンス」を行うなら
・機器Aが LAN にコマンドを送信する
・機器Bが LAN 上のコマンドを受け取る
・機器Bは各種チェック (自分宛かとか正しいかとか) を行い、処理実施
・機器Bは LAN 上にレスポンスを送信する
・機器Aが LAN 上のレスポンスを受け取る
だと思う。

Q1 のほうは何を尋ねてるのか良くわからないので「俺ならこう実装する」を例示してみる
作成するのは PC ソフトのみ (機器 A/B とも既にできているものとする)
機器 A/B -- PC 間の USB というのがよくわからないけど仮想 COM になっているものとして
以下主語はPCソフト

Aに向けて送信開始+Bからの受信データを破棄
Aへの送信完了(または開始)からタイマーカウント開始
Bからの受信データを一式受信(受信中にデータ内容のチェックをすることはしない)
受信データは System.Byte[] で受け取る (.NET の System.Char はこの目的には適合しないことが多い)
- タイマーがアップしたら所定時間内にレスポンスが無かった判定
- タイマーがアップする前に所定のバイト数を受信したら

受信バイト数チェック、rvdata[0] が 0x02 かチェック、BCC をチェック、その他電文の整合性をチェック
全部合格なら処理(表示するとかなんだとか)

引用返信 編集キー/
■75263 / inTopicNo.3)  Re[2]: シリアル通信 受信コマンド VB2008
□投稿者/ ガッキー (7回)-(2015/03/09(Mon) 16:18:54)
■774RRさん

お返事が遅くなりました。
ご回答ありがとうございます。参考にさせて頂きます。
状況としては、なんとか調べながら受信コマンドを完成させる事ができました!

また、何かありましたらご相談させて頂きたいと思います。ありがとうございました!
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -