• ベストアンサー

シリアル通信ができません

VBの5.0を使っています RS232Cケーブルで計測器の制御・情報取得を目指していますが上手くいきません このサイト(http://spectrum123.at.infoseek.co.jp/vb/vb_5/vb_5.htm) を参考にしています 現状では実行すると制御機器が「Remote Mode」を表示するので何らかの信号が出ていることは間違いないのですが 計測器の説明書にしたがってコマンドを送信してもリアクションがありません どうか、よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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     <==追加されたらどうです。

Mnosan
質問者

お礼

MSComm1.RTSEnable=true を追加するとコマンドを受け付けてくれました リアクションもちゃんと帰ってきます 他の機械(電圧計)ではRTS信号がなくても動いていたので そのままにしていましたがこちらでは必要だった様です 問題は解決しました ありがとうございました

その他の回答 (3)

回答No.3

本当にそのケーブルと通信条件で通信出来ていますか? OSがVISTAでなければ、アクセサリのハイパーターミナルを使って 正しく通信できることを確認したほうが良いです。

Mnosan
質問者

補足

確認したところハイパーターミナルに *IDN? THORLABS,PM30,M00228560,1.4 (Jan 03 2006) :POWER? 2.152784e-07 といった風にリアクションしたので接続に問題はないと思います

回答No.2

#1の回答者です。 補足です。 相手の機器によって、ストレートケーブル、クロスケーブルと 使い分けしないといかないので、その当たりもどうなっている のですか。 とりあえず、質問の情報が少なすぎます。単に通信できないでは どう答えていいか迷います。もうすこし、詳しく述べて下さい。 出来たら、ソース、更に相手機器のケーブル結線図、通信手順の 情報があれば、もう少し具体的に述べる事ができます。

Mnosan
質問者

補足

ケーブルについては説明書からクロスケーブルだと確認しました ちなみにケーブルは以下のようになっています 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

回答No.1

通常は手順通りにしておればいけるはずです。 チェックする項目はすべてチェックされたのでしょうか。 通信速度、パリティ、データビット長、ストップビット長 は正しく相手機器に合わしたのでしょううか? その当たりが詳しく質問内容に記載されていないので、 どうされたのですか?。 ケーブルの結線状況はどうなのですか?。 機器によっては、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 でラインモニタ は手にはいります。

関連するQ&A

  • VB6でシリアルポートの制御

    VB6のコントロールまたは、VB6で使用可能なAPIを使って、シリアルポートの内、DTRとRTS信号線を常にHigh(ON)の状態にすることは可能でしょうか? RS-232CからRS-422へ変換して機器を制御するのですが、変換器がこの信号線を電源として動作するので、常にHigh(ON)の状態にしたいのです。 よろしくお願いします。

  • シリアル通信でのデータ取りこぼし

    はじめまして。 現在、計測機器からシリアル通信で測定値を取得しています。 その測定機器は1秒間当たり、1000データ測定できるのですが、 プログラムで収集した際、取りこぼしが多く発生します。 取りこぼしがないよう収集するには どうすれば、いいのか、教えていただけないでしょうか? よろしくお願いします。 動作の流れは  (1)測定ボタンを押す  (2)1秒間測定する (1000データ) → 保存 ◆教えてほしい箇所  (3)1秒後自動的に終了する 環境  OS:Windows XP  プログラム:VB.NET 2008  通信:RS232C  測定データ1個当たり:X.XXXX (6桁)

  • シリアル通信の通信・検証方法とは?

    Visual C++ 6.0(MFC)でプログラミングを行っています. VB 6.0でPCから値を入力し,PICへRS232Cケーブルを用いて値を送り,モータコントロールするプログラムは既に存在しており,現在はVBで書かれていた部分(インターフェイス部)をVC++に書き換えようとしています. サンプルプログラムを参考にシリアル通信に関するVC++のプログラムは完成し,PCからモータの制御を行おうと思ったのですが,うまくいきません. こういった際,どこに問題があるのかを検証したいのですがどうすればいいでしょうか? 現状, 1,シリアル通信ができていない 2,シリアル通信はできているが,PICへ値がうまく格納されていない 3,それ以外 問題があるのは分かるのですが,プログラマーのほうに原因がフィードバックされないため困っています. 明確な答えでなくても,アドバイスのようなものがいただけたら幸いです.

  • VB2005でシリアル通信(RS-232C)

    全くの初心者です。 オリジナルの計測装置とそれ用のソフトを作成することになりました。 ソフト作成の前にハードとの通信仕様を考えているのですが、 下記の点がよくわからず、どなたかご教示いただけないでしょうか。 ・RTSをフロー制御でなく、通信の一部(ハードへの命令信号)して使用したい。(データ送受信と全く独立してRTSをオン・オフしたい) ・調べたところ、EscapeCommFunctionが関連ありそう ・VB2005 express editionでEscapeCommFunctionのAPI(?)が使えるでしょうか。また、他に方法があるでしょうか ・また、Excel(2000)のVBAで同様のことが可能でしょうか。 よろしくお願いいたします。

  • PCからシリアル通信で外部ハードの制御

    PCからシリアル通信(USB、COM、RS-232C等)で、外部のハードを制御するプログラムを勉強したいと思ってます。 そこで、2つ質問したいことがあります。 1:初心者向けの外部のハードを手ごろに買える業者やサイト 2:PCで外部接続機器を制御することの仕組みを初心者向けにわかりやすく説明してるサイト それらを探していますが、なかなか自分に合うサイトが見つかりません。 学校とかで教育用に使われているものが合ってるかもしれませんが、 いいサイトご存知の方がいればよろしくお願いします。 今のところ単純に、PC上のツール(C言語かVBで作成したい)から、なにかボタンを押したら外部ハードのLEDが点灯するとか、簡単なものを作りたいと思ってます。

  • RS485とRC232Cについて

    ここのカテゴリーでいいのかわかりませんでしたが、質問させていただきました。 私が今使っている機器は家庭用及び産業用の空調制御のマイコンですが、RS485のインターフェイスがあります。現状使用していないのですが、ここには各空調機器の運転時間や運転動作回数、週間スケジュール(タイマ)などの機能が搭載されています。この機能を使用するにはどうしたら良いのかわかりません。 RS485からRC232Cの変換でノートパソコンに信号を入力することができるようですが、どのようなソフトでこの信号を見ることができるのでしょうか?また、信号が生のデータの場合、この空調制御マイコンのメーカーに何をどうきいたらいいのかさっぱりわかりません。通信について、関連のサイトを教えていただけませんか?

  • USB/RS232C変換ケーブルの通信エラー

    ノートパソコンと測定機器間をUSB/RS232C変換ケーブルを接続して制御を試みていますが、 頻繁に通信エラーが起こり停止する測定機器もあれば、全く停止せずに良好な測定機器もあります。 PCの方はノート、デスクトップ、OSは関係ないようです。 変換ケーブルは各種試しました。  変換ケーブルによってRS232C信号電圧レベルが異なりますが、大きいから良好とは限らないようです。 どのような解決方法がありますでしょうか? よろしくお願いします。

  • VBで二つの信号を送るには?

    よろしくお願いします VBで計測機械の制御をしようと考えているのですが、うまくいきません 具体的にはコマンドボタンを押して、計測機器に設定を送る際 先発の信号が受け付けられず、後発の信号のみが受け付けられる結果になります それぞれの信号が間違いないことは確認しているので 入力ごとにコマンドボタンを設定することも考えましたが、 見た目もごちゃごちゃしてよくないので、できればボタンひとつで行きたいと思います 一部ですがコードを貼っておきます よろしくお願いします Private Sub Command4_Click(Index As Integer) If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If Dim W As Single W = Text1.Text W = W / 1000 MSComm1.Output = ":WAVELENGTH " & W & "e-06" & vbCrLf Static R As Integer If Combo1 = "3μw" Then R = 3 If Combo1 = "10μw" Then R = 4 If Combo1 = "30μw" Then R = 5 MSComm1.Output = ":RANGE " & R & vbCrLf End Sub

  • RS232とRS485の切替

    マイコンにRS232とRS485で制御可能な機器を各1台接続したいと考えています. マイコンにはUARTポートが1個しかありませんので,リレーまたはフォトカプラで信号線を切り替えて通信しようと考えていますが、問題ないでしょうか? 通信は常にマイコンから各機器に送信されるようにする予定です.

  • IrDA通信データの収録方法

    こんにちは、いつもお世話になっています。 仕事でIrDA通信で受信したデータをリアルタイムで収録するという、私にとってはかなり上級の仕事をおおせつかってしまいました。 ある計測機器から得る信号をIrDAポートからPCに取り込み、少なくとも送信側(計測機器)の転送周波数で記録したいのです。こういった収録用のソフト(ターミナル?)はたとえばC++なんかでも作成できるのでしょうか?計測機器のメーカーに問い合わせたところ、「ターミナルがあれば記録は可能」といっていました。 計測機器にはIrDAの送信ポートがついています。手持ちのPCも赤外線受信ポートがついていて、計測機器を認識しています。やや古いのが心配です。OSは98で、現実問題としてこれ以上アップグレードするのは不可能と思われます。また、手元にある使えそうなソフトとしては、LABVIEWとBOLAND C++があります。このようなプログラミングor制御ソフトで収録ターミナルを作成することができるでしょうか?ご経験がおありであれば、ぜひアドバイスいただければと思います。仕事でMATLABを使っていてこれは結構使えるほうだと思いますが、C++などプログラミングはかなりの初心者です。LABVIEWはその中間あたりです。こんな私にもこの仕事はやり遂げることができるでしょうか?アドバイスよろしくお願いします。

専門家に質問してみよう