受信データサイズが動的に変わる時にタイムアウトせずにデータを受信するには?


PEN  2010-02-16 19:18:30  No: 71404

同期処理でシリアル通信するプログラムを作成しています。
受信するデータなのですが、動的にサイズが変わります。
ただし、受信するデータの最大長は決まっていますので、第3引数に最大サイズを入れています。

以下、受信する処理のソースコード。
ReadFile(m_hComm, pbyData, MAX_SIZE, (DWORD*)pnRealLen, NULL);
// 第1引数: COMハンドル
// 第2引数: 受信データのバッファ
// 第3引数: 受信する最大バイト数
// 第4引数: 受信したバイト数のバッファ

ほとんどの場合、最大サイズ以下のデータが送られてくるため、
ReadFileでは、指定したTimeoutの時間分過ぎてからTimeoutして受信完了、
となっていまいます。

どのようにしたらTimeoutせずに、受信完了とできるのでしょうか?
ご教授お願い致します。


オショウ  2010-02-16 20:52:17  No: 71405

私も長さが可変するシリアル通信をやったことありますが
現行のOSのAPIなら、ReadFileEx使って、行います。

それも受信長は、受信する最小サイズで。

ただ、何かコマンドを送信(要求)してから受信するので
あれば、受信長が特定できますので、その長さを待てばよ
く、受信してもないと解らない場合は、その長さが解る処
まで一旦受信し、判断して不足分を再度読みだす。

昨今はCPUも非常に高速でシリアル通信デバイスの受信
バッファも多い場合(PCIバスに挿すボード等の場合)
1バイト受信を繰り返して、所定の長さを受信させるよう
なアルゴリズム組みます。

C言語ならそう処理時間を気にせずにできるんじゃ〜ない
ですか?

同時8chでもやりましたんで、できますヨ!

以上。参考まで


仲澤@失業者  2010-02-17 02:53:59  No: 71406

完全に受信データ長が不明な場合は1Byte受信しかありません。

ヘッダー部に可変部のByte数が記述されている構造の場合は、
まず、ヘッダー部を固定サイズで受信後、可変部をヘッダーに
記述されているサイズ分受信する。で良いでしょう。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加