掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
シリアル通信でのフロー制御 (ID:18174)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
[[結果報告]] << 結論 >> 「Windowsの標準ポートでもXon/Xoffのフロー制御は有効である」 << 今回の謎の発生原因 >> WriteFileで2バイト以上のデータをまとめて送信していたた。 送信エラーが発生していたが、(Portmon.exe では TIMEOUT 扱いになっている) コンポーネントの考慮不足により、エラーが無視されデータを次々送信していった。 [推測] 受付側の機器が、許容範囲以上のデータを受信したが、処理できなかったためエラーになる。 このとき、受け取った全てのデータが切り捨てられるため、受付機器のバッファには 空きが残ったままになり、Xoff信号が送信されない。 エラーを検出せず、アプリ側が次々データを送信しするため、フロー制御が 有効ではないように見えた。 <<対応>> 以下のいずれかの対応で、回避可能と推測される。 (1)データの送信は、1バイトずつ行う 1バイト送信することで、受付機器のバッファに空きがなくなると、 即Xoffが発行され、Windowsのポートが送信を停止する。 また、実際にWriteFileする前に、Windowsの送信バッファに空きができるまで 待機することで、Xoffで送信停止しているバッファの溢れを防ぐことができる (TCommでは実装済み)。 未検証ではあるが、他のCommコンポーネントの中には、必ず1バイトずつの 送信を行うものもあるようだ。 この対応をしているコンポーネントでは、発生しない。 (2)まとめて送った後に、実際に書き込みを行ったサイズをチェックする。 WriteFileの引数の4番目で、実際の書き込み数を得ることができる。 WriteFile(FHandle, Buffer, Size, dwBytesWritten, 〜 ただし、TCommコンポーネントでは、オーバーラップ指定で開いているため、 WriteFileでの常に0になるため、GetOverlappedResultの第3引数で取得することになる。 GetOverlappedResult(FHandle, 〜, dwBytesWritten) do 受付機器のバッファ溢れ等でエラーになった場合は、WriteFileで指定した データサイズと、書き込まれたサイズは一致しない。 また、GetOverlappedResultの結果が True で返ってくるため、エラーと 認識しない。GetOverlappedResultの結果が True であっても、書き込みサイズと 書き込まれたサイズをチェックする必要がある。(TCommでは未対応) 紆余曲折を経て導き出された回答は、コンポーネントの不具合(考慮不足)及び、 使用者(私)の知識不足にありました。 kkkさん、いろいろお手数おかけしまして、すいませんでした。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.