[リストへもどる]
一括表示

投稿時間:2003/01/31(Fri) 14:53
投稿者名:VB初心者
Eメール:nano-@hyper.cx
URL :
タイトル:
OnComm イベントについて
初めまして、VB初心者と申します。

VBに関しては全くの素人なんですが、
VBを使用して装置制御の開発プログラムを作成しております。

コミュニケーション (MSComm) コントロールを利用して、装置とシリアル通信を
しているのですが、イベント ドリブンによる通信をするために、OnComm イベントを
使っても、通信イベント(データ受信)がトラップされません。
ただ、CommEvent プロパティにはデータ受信完了になっています。
(この状態で、INPUTプロパティを利用してデータを取り込むと、
問題なく通信データは読み込めます)

また、シリアル通信を開始しすると、全てのイベント(例えば、コマンドボタンさえ
押せなくなります)がトラップされなくなり、プログラムが応答していないので、
強制終了になってしまいます。(ただ、この間もOnComm イベントは上手くトラップ
されませんが、シリアルポートからデータの送受信はできており、データはコン
ピュータ上に取り込まれて、画面上では逐次表示されております)

動作環境は
OS:win2K
VB 6.0(SP5)
です。

素人ですので、質問する際の情報が欠落している可能性もありますが、
コミュニケーション (MSComm) コントロールについてのサイトや
VBに関する本は何冊か読んで、2週間ほど悩んでいますが、解決しておりません。

何卒、ご教授いただけますと幸いです。
よろしくお願いいたします。

投稿時間:2003/01/31(Fri) 15:36
投稿者名:ゆうや
Eメール:curren62036@yahoo.co.jp
URL :
タイトル:
Re: OnComm イベントについて
こんにちは。初めてお返事させていただきます。
Win98SecondEdition で VB6.0SP5 を使っています。

私もCommコントロール使ってツールを作ったりしていますよ。難しいですよね。
合っているかわかりませんが、経験からコメントさせて頂こうと思います。参考にしてください。

> ・・・OnComm イベントを
> 使っても、通信イベント(データ受信)がトラップされません。
> ただ、CommEvent プロパティにはデータ受信完了になっています。
> (この状態で、INPUTプロパティを利用してデータを取り込むと、
> 問題なく通信データは読み込めます)
Inputプロパティにデータが入っているということは受け取れているんですねぇ。送られてくるデータサ
イズとRThresholdプロパティの値は合っているでしょうか?ずれているとイベントが起きません。
あと、受信されるまでに、実は他の通信イベントが来ていた通信エラーが起きていた、なんてことはな
いでしょうか??

> また、シリアル通信を開始しすると、全てのイベント(例えば、コマンドボタンさえ
> 押せなくなります)がトラップされなくなり、プログラムが応答していないので、
> 強制終了になってしまいます。(ただ、この間もOnComm イベントは上手くトラップ
> されませんが、シリアルポートからデータの送受信はできており、データはコン
> ピュータ上に取り込まれて、画面上では逐次表示されております)
多分、受信完了待ちとか、通信している部分(関数とか)を無限ループで組まれているのでしょうか?
Do Until 受信完了
    ・・
    DoEvents
    ・・
Loop
のように、DoEventsっていうのを入れないと、Windowsの制御がそのLoop文に占有されて何もできなくな
ってしまいます。詳しくは他の参考書などで「DoEvents」を見てみてください。

あと、私が参考にした(なった)ホームページをご紹介します。よかったら参考までに。
「SPECTRUM電子工作ページ」さん
http://members.tripod.co.jp/spectrum123/index.htm

根本的な解決にはなっていないかもしれませんが、参考にしてみてください。

投稿時間:2003/01/31(Fri) 17:18
投稿者名:VB初心者
Eメール:nano-@hyper.cx
URL :
タイトル:
Re^2: OnComm イベントについて
ゆうやさんご教授ありがとうございました。

> Inputプロパティにデータが入っているということは受け取れているんですねぇ。送られてくるデータサ
> イズとRThresholdプロパティの値は合っているでしょうか?ずれているとイベントが起きません。
はい、データはInputプロパティによって読み出すことができます。
送られてくるデータサイズはまちまちですが、RThresholdプロパティは1にしておりまして、1バイトの
データが来るたびに、OnComm イベントでトラップできるようにしています。
データサイズをあわせるということは、送られてくるデータのサイズによってRThresholdプロパティを毎回
変更する、又はInputLenプロパティを用いて受信データ数を制限して合わせるということが必要と
考えてよろしいでしょうか?

> あと、受信されるまでに、実は他の通信イベントが来ていた通信エラーが起きていた、なんてことはな
> いでしょうか??
これはないかなと思っております。
COMポート1台のみで制御していても結果は変りませんでした。

> 多分、受信完了待ちとか、通信している部分(関数とか)を無限ループで組まれているのでしょうか?
データ要求するコマンドを送信し、タイマー関数を使ってしばらく待った後に、
Inputプロパティによって読み出すことができます。
無限ループは作っておりません。

> あと、私が参考にした(なった)ホームページをご紹介します。よかったら参考までに。
> 「SPECTRUM電子工作ページ」さん
> http://members.tripod.co.jp/spectrum123/index.htm
はい、早速拝見させて頂いて、勉強しています。

本当にありがとうございました。
もう少し頑張ってみます。

投稿時間:2003/02/03(Mon) 11:27
投稿者名:ゆうや
Eメール:curren62036@yahoo.co.jp
URL :
タイトル:
Re^3: OnComm イベントについて
> 送られてくるデータサイズはまちまちですが、RThresholdプロパティは1にしておりまして、1バ
イトの
> データが来るたびに、OnComm イベントでトラップできるようにしています。
> データサイズをあわせるということは、送られてくるデータのサイズによってRThresholdプロパテ
ィを毎回
> 変更する、又はInputLenプロパティを用いて受信データ数を制限して合わせるということが必要と
> 考えてよろしいでしょうか?
1バイト受信したらイベントを発生させたい時は1、100バイト受信したらイベントを発生させたい時は10
0にする、ということでした。語弊があったかもしれません。すみません。
因みに、受信したバイト数はInBufferCountで調べられます。1バイト受信したら1だと思いますよ。
OnCommイベントのところって、
  Private Sub MSComm1_OnComm()
      Dim Buffer
      ‘受信イベントが発生した場合
      If MSComm1.CommEvent = comEvReceive Then
          Buffer = MSComm1.Input ' ←受信バッファ内のデータをすべて取り出す
      End If  
  End Sub
こんな感じになっていますか?1バイトのデータ毎にOnCommイベントを発生させて、データをどっかに退
避すれば次々とデータを取得できそうなのですが・・・。

> データ要求するコマンドを送信し、タイマー関数を使ってしばらく待った後に、
> Inputプロパティによって読み出すことができます。
> 無限ループは作っておりません。
Timerを使っているのですね。・・Timerが悪さをしているということはないでしょうか。前に、シリア
ル通信をすると、全てのイベントがトラップされなくなり・・と書かれていましたが、それとOnCommイベ
ントが発生しないというのも何か関係ありそうな気がするんですけど。Intervalが凄い短いとかないです
か??Interval=1とか。

Commコントロールでのデータのやりとりの方法はいろいろあります。駄目なら違う方法で・・とか、い
ろいろやってみるのもいいかもしれません。私も1ヶ月くらい悩んでましたから(-.-)

まともなお返事ができませんでしたが、いろいろデバッグしてみてください。