アプリ版:「スタンプのみでお礼する」機能のリリースについて

VBの5.0を使っています
RS232Cケーブルで計測器の制御・情報取得を目指していますが上手くいきません
このサイト(http://spectrum123.at.infoseek.co.jp/vb/vb_5/vb_ …
を参考にしています

現状では実行すると制御機器が「Remote Mode」を表示するので何らかの信号が出ていることは間違いないのですが
計測器の説明書にしたがってコマンドを送信してもリアクションがありません

どうか、よろしくお願いします

A 回答 (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     <==追加されたらどうです。
    • good
    • 0
この回答へのお礼

MSComm1.RTSEnable=true
を追加するとコマンドを受け付けてくれました
リアクションもちゃんと帰ってきます

他の機械(電圧計)ではRTS信号がなくても動いていたので
そのままにしていましたがこちらでは必要だった様です

問題は解決しました
ありがとうございました

お礼日時:2008/09/02 16:33

本当にそのケーブルと通信条件で通信出来ていますか?


OSがVISTAでなければ、アクセサリのハイパーターミナルを使って
正しく通信できることを確認したほうが良いです。

この回答への補足

確認したところハイパーターミナルに
*IDN?
THORLABS,PM30,M00228560,1.4 (Jan 03 2006)

:POWER?
2.152784e-07

といった風にリアクションしたので接続に問題はないと思います

補足日時:2008/09/02 13:29
    • good
    • 0

#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

補足日時:2008/09/02 12:03
    • good
    • 0

通常は手順通りにしておればいけるはずです。


チェックする項目はすべてチェックされたのでしょうか。

通信速度、パリティ、データビット長、ストップビット長
は正しく相手機器に合わしたのでしょううか?
その当たりが詳しく質問内容に記載されていないので、
どうされたのですか?。

ケーブルの結線状況はどうなのですか?。
機器によっては、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/se36 … でラインモニタ
は手にはいります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!