ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4009599 RS-232Cにおける制御についての質問です。
質問者:baitoyou65 プラグラミングに対して、全くの初心者のものです。
DelphiでRS-232Cの制御を行おうとしているところですが、どのようにプログミングすればよいのかまったくわかりません。
一応説明書に書かれていることを記します。

(通信ポート設定)
Baud Rate 9600,Stop Bit 2,Parity non,Word Length 8,Flow Control XON/XOFF RTS,DTR
(通信パケット仕様)
・パケットは全て ヘッダー'#'と、ターミネータ'\r'で区切られる。
・パケット内の数値データは、全て16進のアスキーコードで表記。
・機能に応じて以下の4種類のパケットがある。
(1)コマンドパケット
(2)リプライパケット
(3)イベントパケット
(4)データパケット

(パケット一覧)
(1)Command Packet
Format : '#[FID] [P1] [P2] ..[Pn]\r'
  項目   型      内容
  FID short ファンクションID
  Pn long n番目のパラメータ
(2)Reply Packet
Packet mode 0
Format
Normal Reply '#0 [Reply]\r'
Data Type: NUM '#0 [Reply] [Data1] [Data] ..[Data n ]\r'
Data Type: STR '#0 [Reply] [Strings]\r'
  項目   型    内容
 Reply short リプライコード
           0:正常終了 1:コマンドエラー 2:パラメータ           エラー 3:ビジーエラー 4:通信エラー
           10:コマンドに依存したエラー
 Data long n番目の数値データ
 Strings char* 文字列データ
(3)Event Packet
Packet mode=1,Format '#1[Event ID][Event Data]\r7'
項目      型     内容
Event ID short イベントの種類
Event Code long イベントの内容
実際のコマンド仕様を記すのでよろしくお願いします。
1.Connect
[動作]PCと装置の回線を確立する。
[引数]FID 1
P1 0:イベント出力・・・無効
1: ・・・有効
[戻り値] 0:正常終了
2:パラメーターエラー
3:ビジーエラー

2Set Data Output Interval
[動作]データの出力間を設定する。
[引数]FID 7, P1 0:固定,P2 出力間隔 0,10(0xa)〜100(0x64)[/10sec],P2=10の時は1秒間隔でデータを出力する,P2=0の時は出力しない。
[戻り値]0:正常終了,2:パラメータエラー

宜しければ、ちょっとした手がかりで構わないので投稿よろしくお願いします。
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/09 18:37
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.1 Delphi は未経験なので、VB6およびVB.NETの場合で説明します。
※以下の説明は、あくまで私の流儀です。
※通信パケットが不定期に装置からPCに送られる場合を想定してます。
※データ受信に関して説明します。

◎RS232C受信用のクラス
(1) 先ず、受信バッファにデータが入るまでループして待ちます。
(CPU負荷を減らすためにSleepを入れること)
(2) 長時間データがこない場合は、タイムアウトとして仮バッファをクリア。
(3) 受信バッファにデータが在れば、1バイト読込んで仮バッファに追加する。
(フラグを使って“#”〜“\r”の間だけ追加するようにすることも可能)
(4) 仮バッファに追加したデータが“\r”以外なら(1)に戻る。
(仮バッファに追加する前にチェックして“\r”を含めないようにすることも可能)
(5) 仮バッファを本バッファにコピーする。
(6) 仮バッファをクリアする。
(7) パケット受信のイベントを発生させる。

◎パケット判定用のクラス
(1) RS232C受信用クラスがパケット受信イベントを発行するのを待つ。
(2) RS232C受信用クラスの本バッファを取得して、仮パケットに入れる。
(3) 仮パケットの1文字目が“#”以外なら不正データなので仮パケットをクリア。
(4) 仮パケットの2文字目から4文字取り出し、数値に変換する。
(VBの場合なら取り出した文字列の頭に“&H”を付けてVal()関数で数値変換)
(5) 数値によりパケットの種類を判定する。
(もし装置へのコマンドによって送られるパケット種類が決まるなら、動作モードを表す変数で対処する)
以上、ここまで。
回答者:Hayashi_Trek
種類:アドバイス
どんな人:専門家
自信:参考意見
回答日時:
08/05/09 21:45
この回答へのお礼ありがとうございました。参考にさせていただきます。