シリアル通信(RTS)での受信


garakuta  2007-11-30 19:38:51  No: 138250

VB6,XPの環境で、RTS/CTSのハンドシェイクで
ターゲット機器にコマンドを送り、制御しようと
しています。

  通信条件の設定は下記です。
0)    MSComm1.CommPort = 1
1)    MSComm1.Settings = "38400,N,8,1"
2)    MSComm1.Handshaking = comRTS
3)    MSComm1.RThreshold = 1
4)    MSComm1.InputLen = 0
5)    MSComm1.InputMode = comInputModeBinary
6)    MSComm1.RTSEnable = True
7)    MSComm1.DTREnable = True

この条件で、テキストボックスにコマンドの文字を
入力して
      MSComm1.Output = Text1.Text & vbCr
のようにして、ターゲット機器に送ると、ターゲット機器は
コマンドに従って動くところまでは確認できました。

  コマンドの中には、機器の状態などの情報を
パソコンに返すものがあります。
  そのようなコマンドを送っても、何も返って
来ません。
  この問題のため、質問させていただきました。

  受信のコードは下記です。

Private Sub MSComm1_OnComm()
    Dim RcvBytes() As Byte
    MsgBox "割り込み発生"
    Select Case MSComm1.CommEvent
        Case comEvReceive
            '受信処理:入力する
            RcvBytes = MSComm1.Input
    End Select
    DoEvents
End Sub

  設定の3)があるので、ターゲット機器から
1バイトでも受信バッファに入れば、上のOnCommが
実行されるはずですが、メッセージ表示がなく、
OnCommは実行されないようです。

  コマンド送信後、InBufferContを表示させると
数秒後でも値はゼロで、受信バッファに受信されて
いないことがわかりました。

  ハイパーターミナルも一緒に作動させて動きを
見ています。
  ハイパーターミナルでは、返答が必要なコマンドも
問題なく通信できますので、配線不良などのハードの
問題はないようです。

  本VBソフトで返答の必要なコマンドを送って、返答の
受信に失敗した状態でハイパーターミナルを起動しますと
通信が確立した後、機器からの返答信号の受信から
始まります。

  以上のことから、返答の必要なコマンドに対して
機器は返答しようとしてPCに許可を求めているのに
PCから、「了解した;送ってください」という条件を
機器に示さないため、機器がパソコンへのデータ送信を
手控えているのかと思われます。

  RTS/CTSハンドシェイクでデータを受信する場合、
上記の設定では、何か不足しているのでしょうか?


我龍院  2007-11-30 22:29:49  No: 138251

>RTS/CTSハンドシェイクでデータを受信する場合、
>上記の設定では、何か不足しているのでしょうか?
不足はないような気が....

PCからはテキストで送って、相手の機器からはバイナリーで
データーが返ってくるのですか?

基本的な考え方としてOnCommイベントの中でエラー情報と
ラインの変化の情報を取得するようにして下さい。
.
.
Case comEvCD   
         strStates = "CD ラインの状態が変化しました。"
Case comEvCTS
         strStates = "CTS ラインの状態が変化しました。"
Case comEventRxOver
         strErr = "受信バッファがオーバーフローしました。"  
.
.
こんなの、これをログとしてListBoxなんかに流すと何かわかるかも。


garakuta  2007-11-30 22:42:21  No: 138252

我龍院様、ご回答いただきまして、大変ありがとうございます。

  送信のために必要なコードを書いても、受信に必要なコードが
抜けているのかと思いました。

  CTSラインが変化したということがわかるようにコードを書き換えて
みます。

  ターゲットの機器がPCに送信しようとしている(CTSラインが変化?)ときに「どうぞ送って下さい」という信号は、出さなくともよろしいのでしょうか?
      MSComm1.Handshaking = comRTS
      MSComm1.RTSEnable = True
の2行があれば、RTS/CTSラインの制御はウィンドウズがやってくれる
ものでしょうか?


我龍院  2007-12-01 01:29:57  No: 138253

>の2行があれば、RTS/CTSラインの制御はウィンドウズがやってくれる
>ものでしょうか?
その2行でよいはずです。
ウィンドウズと言うよりもRS232Cのドライバーとハードウェアーが
ハンドシェイクを行います。


garakuta  2007-12-01 12:20:16  No: 138254

我龍院様、お礼の返事が遅くなり、申し訳ございませんでした。
また、何度もご回答いただきまして大変ありがとうございます。

  私が考えた2行が書いてあれば、ハンドシェイクに関する
ソフトの記述はOKということですね?

  ここのところをもう一度見直してみます。
それでもだめなら、パソコンを変えてみます。

  ハイパーターミナルでうまく行っているのに、VBでうまく
できないのが残念です。

1)ターゲット機器にコマンドが正しく伝わらない
2)コマンドが伝わってもターゲット機器からRTS(送信要求)信号が
  出ない
3)ターゲット機器からRTS信号が来ているのにパソコンがRTS(OK)
  信号を出さないので、ターゲットは送りたくとも後れない。

のいずれかだと思うのですが、これをどう切り分けようかと
思案しています。(VBでハングアップした状態から、
ハイパーターミナルを起動すると、ターゲット機器の
信号受信から始まると言うことは3)かなとも思えます。)

  我龍院様の最初のご回答にあった、パソコンからは文字で
コマンドを送り、返答はバイナリなのかと言う疑問はその
とおりです。
  PCからは文字でコマンドを出しますが、相手から返ってくる
位置のエンコーダの24ビット情報などは16進数です。


GOD  2007-12-02 09:27:26  No: 138255

基本的な確認で申し訳ありませんが、ポートは開いていますか?


garakuta  2007-12-03 15:06:34  No: 138256

GOD様、レスをいただきましてありがとうございます。
      MSComm1.PortOpen = True
をしているかということであれば、行っていて、
送信はうまくいって、ターゲットを制御できています。

  受信がうまく行かず、受信に対して、ポートを開く
命令が必要であれば追加いたします。


GOD  2007-12-03 19:35:44  No: 138257

>MSComm1.PortOpen = True
>
↑がコード中にあるのであれば問題ないです。
新規プロジェクトに提示されたサンプルコードを貼り付けて実験してみましたが、正しく動作していましたよ。(デザイン時のプロパティは全て初期値で実験しています。)
garakuta さんの方でもし提示いただいているコード以外のコードがあるのなら一度新規プロジェクトで実験してみてはいかがでしょう。

↓テストに使用したコード
Option Explicit

Private Sub Command1_Click()
    MSComm1.Output = Text1.Text & vbCr
End Sub

Private Sub Form_Load()
    MSComm1.CommPort = 1
    MSComm1.Settings = "38400,N,8,1"
    MSComm1.Handshaking = comRTS
    MSComm1.RThreshold = 1
    MSComm1.InputLen = 0
    MSComm1.InputMode = comInputModeBinary
    MSComm1.RTSEnable = True
    MSComm1.DTREnable = True
    MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()
    Dim RcvBytes() As Byte
    Select Case MSComm1.CommEvent
        Case comEvReceive
            MsgBox "受信割り込み発生"
            '受信処理:入力する
            RcvBytes = MSComm1.Input
    End Select
    DoEvents
End Sub


garakuta  2007-12-03 19:48:34  No: 138258

GOD様、わざわざ動作確認までしていただきまして、
大変ありがとうございます。
  実は
    MSComm1.PortOpen = True
を、コマンドボタン2で起動させている以外、
GOD様の示されたコードと同じです。

  テキストボックスに半角英数字のコマンドを
キー入力して、コマンドボタン1をクリックすると
コマンドがターゲット機器に送られて、返答の
不要なコマンドは正しく動作します。

  ただ、ターゲットからの返答が必要なコマンドで
ターゲットからの返答がない、というかOnCommが
呼ばれたときのメッセージが出ないので、VBプログラムと
しては、CTSラインが変わったことも認識していないのだと
思います。

  パソコンを変えてやってみるのと(まだやっていません
でした)、最後はCTSラインをオシロスコープまたはテスターで
見るしかないかと思えてきました。


GOD  2007-12-03 20:33:07  No: 138259

一つ実験をしてもらってもいいですか。

1) フロー制御を「ハードウェア」から「なし」に変更してください。
MSComm1.Handshaking = comNone

2) ボタンを一つ追加して下記コードを追加してください。(クリックイベント時)
Private Sub Command3_Click()
    MSComm1.RTSEnable = Not MSComm1.RTSEnable
End Sub

3) データを送信(受信が発生するもの)

4) 受信が出来ないのであれば新規追加ボタンをクリック(相手側のCTSが変化するはず)


garakuta  2007-12-04 07:14:21  No: 138260

GOD様、何度もありがとうございます。
お返事が遅くなり、申し訳ございません。

  おっしゃられたように変えて、やってみました。

  動くコマンドを送信してもNGなのが、RTSEnableを反転させると
送信されて、動きます。

  受信が発生するコマンドを送信しながら、上を行っても
何も起きませんでした。(OnCommは、呼び出されない)

  通信中にターゲットの電源を切ると、OnCommが発生し、
メッセージが出ることがわかりました、そのとき、
comEvCTSの確認もされました。

  残念ながら、本日時間切れとなり、明日から数日手を
つけられません。

  頭を冷やして、もう一度現象を見直してたいと思います。

  また質問させていただくときは、よろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加