VB6.0にてMSCommを使って、RS-232Cでシリアル通信制御を試みているのですが
送信がうまくいかないため質問させていただきました。
RS-232Cは、RTSで送信要求をし、CTSで送信可能を返して、
DTRで接続要求を出し、DSRで接続可能が返ってきたときに
(RTS,CTS,DTR,DSRがONの時?)データの送信が行われるようなので、
フォームロードで
MSComm1.CommPort = 1 
MSComm1.Settings = "9600,n,8,1" 
MSComm1.RTSEnable = True
MSComm1.Handshaking = comRTS:RTS/CTS
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
として、ボタンが押されたときに送信したいので、
Command1_Clickで
If MSComm1.CTSHolding = True Then
   MSComm1.DTREnable = True
   If MSComm1.DSRHolding = True Then
      MSComm1.Output = "文字"
   End If
End If
としているのですが、
まだプログラムが全然できていないため相手も反応がなく困っています。
CommEvent関係が関係するのかなと思ったりもするのですが・・・
どなたか、ご教授宜しくお願い致します。
まずは PortOpen について調べて下さい。
書き忘れていますが、PortOpenの処理も作っています。
Commandクリックイベントで、
If MSComm1.PortOpen = False Then
    MSComm1.PortOpen = True
End If
というような。
もちろんオープンした後に送信してますよね。
大まかな問題の切り分けを...
1)ハードウェア的には大丈夫ですか。
  PC側を自作プログラムの変わりにハイパーターミナルなどで代用すると正しく送信できますか?ケーブルが間違っているとかないかな。
  あとフロー制御が使えるケーブルかな?
2)相手側のステータスも "9600,n,8,1,ハードフロー"ですか。
3)フロー制御ケーブルに関連してCommand1_Clickをステップ実行したときに Outputまで実行できているか。
>If MSComm1.CTSHolding = True Then
 >   MSComm1.DTREnable = True
 >   If MSComm1.DSRHolding = True Then
 >      MSComm1.Output = "文字"
 >   End If
 >End If
 ドライバーを作ってるわけじゃないですよね。
 ポートをオープンする前に、
  MSComm1.DTREnable = True
  MSComm1.RTSEnable = True
 とやっておけば後は、ドライバーかハードが勝手にやります。
 
  Handshakingに関しては最近はハードのスピードが速いのと、
  メモリーが安い為、殆どの機械は使用しません。
  comNoneに設定してやってみて下さい。
  (本当は昔からこれは癖があって上手くいかない場合が
  多いのです。)
  しかしこれは何?
  MSComm1.Handshaking = comRTS:RTS/CTS
  
  CDHoldingとDSRHoldingですが、
  Shapeコントロールなどを2つ置いて、
  If MSComm1.CDHolding = True Then
        Shape1.FillColor = vbRed
  Else
        Shape1.FillColor = vbBlue
  End If
  If MSComm1.DSRHolding = True Then
        Shape2.FillColor = vbRed
  Else
        Shape2.FillColor =  vbBlue
  End If
  とでもしておけば、少なくてもこの結線が正しいか否か
  判ります。  
  後は  GOD さんと同じ
原因は、相手機器とのステータスが一致してなかったからのようです。
ステータスを合わせて、If文の条件を多少変えたら
通信が行われるようになりました。
GOD さん、我龍院さんありがとうございました。
| ツイート |   |