Mscommを使った通信で、先頭のデータのみ読み出すには?


椰子の木  2005-08-24 20:31:31  No: 91772  IP: [192.*.*.*]

MSCommを用いたシリアル通信プログラムで、受信するデータのうち先頭1バイトのデータのみ読み出したいのですが上手くいきません。
InBufferSizeとRThresholdを1に設定していても、伝送される全データを受信してしまいます。
1バイト受信した時点で受信イベントを発生させるためにはどのようにすればよろしいでしょうか?

開発環境は、Win2000、VB6です。

編集 削除
ガッ  2005-08-24 20:52:21  No: 91773  IP: [192.*.*.*]

・RThreshold=1ということは、1バイト受信するとイベントが発生するということ。
・InBufferSize=1ということは、オーバーフローが発生するかもしれないこと。
> 1バイト受信した時点で受信イベントを発生させるためにはどのようにすればよろしいでしょうか?
RS-232Cはほとんど扱ったことがないので内部のことはよく判りません。
InputLen=1…にすれば、いいかもしれませんねぇ…

まぁ、だめでもちゃんと受信できているようなので、
貴方が"必要なだけ読み取る"機構を作ればいいだけです。

編集 削除
椰子の木  2005-08-25 10:19:01  No: 91774  IP: [192.*.*.*]

InputLenを1にしても動作に変わりはありませんでした。

イベントが発生した時点で全データ(この場合16バイト)取得してしまっているので、
もしかしたらハードの仕様かもしれないですが…。

編集 削除
ガッ  2005-08-25 10:30:28  No: 91775  IP: [192.*.*.*]

> InputLenを1にしても動作に変わりはありませんでした。
> イベントが発生した時点で全データ(この場合16バイト)取得してしまっているので、
おや…MSDNには
# InputLen
# Input プロパティによって受信バッファから読み取られるバイト数を設定または取得します。
と書いてあったので、てっきりInputプロパティで読み取られるバイト数を設定できると思ったのですが…
→サンプルもそんな風でしたし…

> もしかしたらハードの仕様かもしれないですが…。
それはないはずです。
MSCOMMがCOMポートとプログラムの間に入っているので、
内部でバッファリングやその他もろもろのことをしているはずだからです。
→貴方が"受信した"と思っているのは、
  実は"MSCOMMコントロールが受信してバッファリングしたデータを読み取っている"
  だけだと思います。

…しかしまぁ、出来ないのなら"必要なだけ読み取る"機構を噛ませる必要がありますねー

編集 削除
椰子の木  2005-08-26 16:01:14  No: 91776  IP: [192.*.*.*]

>→貴方が"受信した"と思っているのは、
>  実は"MSCOMMコントロールが受信してバッファリングしたデータを読み取っている"
>  だけだと思います。
むむむ・・・なんだかMSCommでは無理なような気がしてきました。
MSCommではなくAPIを使えばうまくいけるのでしょうか・・・?

編集 削除
ガッ  2005-08-26 16:50:57  No: 91777  IP: [192.*.*.*]

私が言いたかったのは、
MSCommやAPIに処理を求めるのではなく、
そのような処理を自分で書きましょうということです。

貴方は、"1バイト受信したい" と思って、
"16バイト受信してしまう"なら、
・内部でなんとかして1バイトずつ送り出してくれるようには出来ないか?
と思っていらっしゃいますが、

私なら、
・自分で16バイトから切り出して使う、そういう機構を作るか…
と考えるわけです(強引に)

…まぁ、最善はInputLenを1にしたら、必ず1バイトだけ受信してくれること…
なんですけどねぇ…

> むむむ・・・なんだかMSCommでは無理なような気がしてきました。
> MSCommではなくAPIを使えばうまくいけるのでしょうか・・・?
APIにCommポートを叩くのがあったかな…デバイスドライバを直接になると思う…
まぁいずれにせよ、MSCommはCommの性質を緩衝してくれているので、
それをやめて生でCommポートを使うとなると相当大変だろうと思います。

編集 削除