バッファ(緩衝装置) 機械性能の違いを吸収する

バッファとは、一時的にデータを格納する領域、または変数、もしくはシステム
(「COMポートは、狭義には、PC/AT互換機のRS-232C用シリアルポート。」と書いてある。このウィキでは、RS232Cと書いたり、シリアルポートと書いたり、COMポート、COMと書いたりしてます。)
 COMポートととの通信でPC対COMでつながった装置の場合は大抵COMでつながった装置が低速だ。
PCの性能が高いのでどんどん処理してcomポートにデータを送る。
comでつながった装置は、せっせと処理するがデータを受け取る暇はない。
 この差があるため、バッファには未処理データが貯まる。
通信速度などの設定をしているのに???と思うかもしれませんが、基本的にこれらは通信自体を実現するパラメータでバッファについてはOSや装置の実装の話だ。

 対策としては、フロー制御(流れ制御)が必要だ。COMポートならフロー制御用のポートがある。
それがピン番号7、8だ。
ただこれを使う前に送るデータ自体を制御するのが簡単だ。
例えば何度も同じことは送らない。送る必要がないデータは送らない(バッファに貯めない)。
また、フロー制御するにしても全二重通信になっているのだから独自にプロトコルを作ってフロー制御する。
全二重通信とはどちらからでも好きなタイミングでデータを送れる。
PC------>装置
  <------
例えば高速な装置は低速な装置が「L」を送ってくるまで何も送らない。
ところでReadFile関数(Win32API関数)は呼び込むデータが来るまで待つ。待つとはこの行で処理が止まる。
止まるとウィンドウの描画処理も止まるので固まったような状態に見える。
これを回避するには通信用のスレッドを作るか別に通信用プロセスを作るかのどちらかだ。
別にプロセスを作るとプロセス間の通信になって面倒だ。
スレッドなら同じプロセス内なのでグローバル変数をスレッド間で共有できる。
ただし、変数を共有する場合、タイミングによっては競合により変数値がめちゃくちゃなる。
その変数をスレッド間で書き込みをするからめちゃくちゃになる。書き込まないなら問題なし。
これの回避にはMutex:ミューテックスを使う。Mutexは、mutual exclusion 相互排他の先頭の文字を組み合わせた造語。セマフォ(手旗信号)というのもある。排他制御はどちらかが使えればいい。
名前:
コメント:
「今日の訪問数: -
「昨日の訪問数: -
「今までの訪問数: -
最終更新:2010年02月14日 22:08
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。