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 さん、我龍院さんありがとうございました。
ツイート | ![]() |