- ベストアンサー
シリアル通信ができません
VBの5.0を使っています RS232Cケーブルで計測器の制御・情報取得を目指していますが上手くいきません このサイト(http://spectrum123.at.infoseek.co.jp/vb/vb_5/vb_5.htm) を参考にしています 現状では実行すると制御機器が「Remote Mode」を表示するので何らかの信号が出ていることは間違いないのですが 計測器の説明書にしたがってコマンドを送信してもリアクションがありません どうか、よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
ハイパターミナルで通信するのであれば、ケーブルはほぼ問題がないと思います。 少し気になる点があるので、以下に述べますので、できたら答えて下さい。 (1) MSComm1.Output = ":SENS:SERNR?" & vbCr どうして vbCr になっているのですか? vbCrLf では駄目なのですか? ハイパターミナルでは、終端文字はvbCrLfだったような気がするが? (2) テキスト受信になっているので、本来なら問題のないはずだが、 念の為に以下の様に設定しても駄目か確認して下さい。 MSComm1.InputLen = 1 そんな事はないとおもうが、MSComm1.RThreshold = 1 になっているので 1文字受信するごとに割り込みイベントが発生するが、受信モードがテキスト になっていると、変にOSの方で、よみ取れない時が過去にあったような気 がする。(たとえばCRLFがきないとよみとれないとか、 ある程度バファーに溜まらないと読み出せないとか) MSComm1.InputLen = 1 にすると、MSComm1.Input は1文字でも強制的に 読み込む事が出来る様にするプロパティなので、一度設定して下さい。 (3) 勿論、記載されていないが、通信速度、パリティ、データビット長、ストップビット長 は機器とあっているのでしょうね。 (4) #1の回答でも述べた様に、MSComm1.Output = ":SENS:SERNR?" & vbCr を実行した後、MSComm1.OutBufferCount の値はゼロになっていますか? その当たりは確認されてのでしょうか? (5) MSComm1.Output = ":SENS:SERNR?" 実行した後に、MSComm1_OnComm()の イベントは発生するのでしょうか?。その当たりが詳しく書いていないですが。 全く、イベントは発生しないのですか?。 なにか手がかりを書いてください。 (6) 私の過去の顧客で ハイパーターミナルでは受信するのに、アプリケーションででは受信しないことが ありました。 ハイパーターミナルとコミュニケーション (MSComm) コントロールの違いはどこかと いいますと、 ハイパーターミナルでCOMポートをオープンした時は、無条件でRTS信号がONになるが、 MSComm1.PortOpen でオープンした時は、RTS信号がOffになっている事です。 MSComm1.RTSEnable=true にすることで、解決した事があります。 MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.RThreshold = 1 MSComm1.SThreshold = 1 MSComm1.RTSEnable=true <==追加されたらどうです。
その他の回答 (3)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
本当にそのケーブルと通信条件で通信出来ていますか? OSがVISTAでなければ、アクセサリのハイパーターミナルを使って 正しく通信できることを確認したほうが良いです。
補足
確認したところハイパーターミナルに *IDN? THORLABS,PM30,M00228560,1.4 (Jan 03 2006) :POWER? 2.152784e-07 といった風にリアクションしたので接続に問題はないと思います
- kunkun_129
- ベストアンサー率64% (16/25)
#1の回答者です。 補足です。 相手の機器によって、ストレートケーブル、クロスケーブルと 使い分けしないといかないので、その当たりもどうなっている のですか。 とりあえず、質問の情報が少なすぎます。単に通信できないでは どう答えていいか迷います。もうすこし、詳しく述べて下さい。 出来たら、ソース、更に相手機器のケーブル結線図、通信手順の 情報があれば、もう少し具体的に述べる事ができます。
補足
ケーブルについては説明書からクロスケーブルだと確認しました ちなみにケーブルは以下のようになっています 2RXD←------3TXD 3TXD------→2RXD 7RFR------→8CTS 8CTS←------7RFR 5GND--------5GND 4DTR------→1RLSD 6DSR 1RLSD←----4DTR 6DSR 9RI 9RI コードは以下のように Private Sub Form_Load() ' 表示文字の初期設定 Text1.Text = "コマンドを入力" Text2.Text = "" Label1.Caption = "送信文字" Label2.Caption = "受信文字" '(1)Loadイベントプロシージャ '(2)テキストボックス1の文字設定 ' テキストボックス2の文字設定 '(3)ラベル1の表示文字設定 ' ラベル2の表示文字設定 ' ラベル3の表示文字設定 Label3.Caption = "簡易通信テストプログラム MSComm" Command1.Caption = "通信テスト開始" ' MSCommコントロールの初期設定 MSComm1.CommPort = 1 MSComm1.Settings = "9600,n,8,1" MSComm1.RThreshold = 1 MSComm1.SThreshold = 1 End Sub '(4)コマンドボタンの表示文字設定 '(5)通信ポートCOM1を指定 '(6)通信条件設定 '(7)1バイト受信毎にOnCommイベント発生 ' 送信バッファ空でOnCommイベント発生 Private Sub Command1_Click() If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If Text2.Text = "" MSComm1.Output = ":SENS:SERNR?" & vbCr End Sub '(8)Command1のクリックイベントプロシージャ '(9)シリアルポートのオープン '(10)テキストボックス2の文字をクリア '(11)データの送信 入力データ+リターン符号の付加 Private Sub MSComm1_OnComm() Dim Buffer As Variant Select Case MSComm1.CommEvent Case comEvReceive Buffer = MSComm1.Input Text2.Text = Text2.Text & Buffer '(12)送受信のOnCommイベント '(13)受信バッファの変数宣言 '(14)CommEventプロパティに対する処理 '(15)受信データ有り '(16)受信データをバッファに格納 '(17)受信データを順次表示する Case comEvSend Case comEvCTS Case comEvDSR Case comEvCD Case comEvRing Case comEvEOF '(18)他の通信イベントでは何もしない Case comEventBreak MsgBox "中断信号を受信", vbCritical Case comEventCTSTO MsgBox "CTSタイムアウト", vbCritical Case comEventDSRTO MsgBox "DSRタイムアウト", vbCritical Case comEventFrame MsgBox "フレーム エラー", vbCritical Case comEventOverrun MsgBox "ポート オーバーラン", vbCritical Case comEventCDTO MsgBox "CDタイムアウト", vbCritical Case comEventRxOver '(19)警告メッセージ アイコンを表示 MsgBox "受信バッファ オーバーフロー", vbCritical Case comEventRxParity MsgBox "パリティ エラー", vbCritical Case comEventTxFull MsgBox "送信バッファがいっぱい", vbCritical Case comEventDCB MsgBox "予期しないDCBエラー", vbCritical Case Else MsgBox "その他の通信エラー", vbCritical End Select End Sub Private Sub Form_Unload(Cancel As Integer) If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If End Sub
- kunkun_129
- ベストアンサー率64% (16/25)
通常は手順通りにしておればいけるはずです。 チェックする項目はすべてチェックされたのでしょうか。 通信速度、パリティ、データビット長、ストップビット長 は正しく相手機器に合わしたのでしょううか? その当たりが詳しく質問内容に記載されていないので、 どうされたのですか?。 ケーブルの結線状況はどうなのですか?。 機器によっては、RTS/CTS信号がないのがあります。 その場合、機器側からCTS信号が出ていない事があります。 もし、CTS信号が相手機器から出ていないと、パソコンから データが送出出来ません。 この場合、RTSとCTSを結線するか、パソコンの MSComm1.RTSEnable=true にするなどします。 MSComm1.CommPort のポート番号は確認しましたか?。 パソコンにシリアルポートがひとつしかない場合は、 システムのデバイスマネージャのプロパティで確認した ポート番号を設定して下さい。 それでも行かない場合は、イベントプロシージャ MSComm1_OnComm() 内で、コマンド送信をした時、エラーがでてないか確認します。 コマンド送信後に、1秒位後に、MSComm1.OutBufferCount の値は ゼロになっていますか?。これがゼロになっていないと、なんらかの 原因で相手側にコマンドが伝わっていないと思います。 この遅れなかった原因は、ケーブルの結線(CTS信号がONにならない)に問題があるか、 MSComm1.CommPortのポート番号が間違っている可能性があります。 この場合、通信速度、パリティ、データビット長、ストップビット長の設定が間違っていて も、間違ってまた送信されるので、関係がないです。 DSR信号がOFFの場合も送出しないので、この場合、DSR信号とDTR信号を結線します。 上の確認をしてコマンドが送れているにも関わらず、相手機器からデータが送られてきない 場合、通信速度、パリティ、データビット長、ストップビット長の設定が間違っていて、 相手にコマンドが正しく認識されていない可能性があります。 また、RTS信号が相手に伝わっていない可能性があります。MSComm1.RTSEnable=true に するなどして確認して下さい。 相手からデータを受信すると、イベントプロシージャ MSComm1_OnComm() が発生するので その中で、MSComm1.InBufferCount の値が1以上になっているか確認します。 これが1以上にならないと、データを受信していない事になります。 以上をみても原因が追求できない時は、ラインモニタを間に入れて確認するのが 一番早いです。 また、ソフト的なラインモニタもありますのでそれをパソコンにインストールされて、 送受信状況を確認して下さい。 http://www.vector.co.jp/soft/winnt/hardware/se365661.html でラインモニタ は手にはいります。
お礼
MSComm1.RTSEnable=true を追加するとコマンドを受け付けてくれました リアクションもちゃんと帰ってきます 他の機械(電圧計)ではRTS信号がなくても動いていたので そのままにしていましたがこちらでは必要だった様です 問題は解決しました ありがとうございました