win32の関数を使ってCOMポートに直接RS232Cをつないで通信を行うプログ
ラムの質問なのですが。
CreateFile()関数でポートをオープンしその後DCB構造体のメンバを
変えて
・ハード制御
・Xon/Xoff
・両方なし
の3つの方法で通信をしたいと思うのですが、このハード制御というのはどこを変更
したらできるのでしょうか?
また、Xon/Xoffは
DWORD fOutX: 1; /* XON/XOFF出力フロー制御 */
DWORD fInX: 1; /* XON/XOFF入力フロー制御 */
このメンバをTRUE又はFALSEにすればよいのでしょうか?
どうそよろしくお願いします。
ハードウェアフロー制御を行うには、RTS/CTSフローでしたらDCBの、
fOutxCtsFlowにTRUE、fRtsControlにRTS_CONTROL_HANDSHAKEをセットします。
行わないなら、それぞれFALSE、RTS_CONTROL_ENABLEをセットしておけばよいと思います。
Xon/Xoffソフトウェアフロー制御を行うにはDCBの、
fInXをTRUEにすれば受信バッファの状態によってXon/Xoffを送信するようになります。
fOutXがTRUEであれば、Xoffを受けて送信を停止しXonを受けて送信を再開するようになります。
XonCharとXoffCharが変えられるようになっていますので、
通常のXon/Xoff文字を使用するのなら一応0x11(Xon)と0x13(Xoff)をセットした方がよいでしょう。
これらは独立して設定可能ですから、ハードウェアフロー制御とXon/Xoffフロー制御を同時に
行うようにも、どちらとも行わないようにもできます。
受信フロー制御を行う場合は
受信停止境界(XoffLim)、受信再開境界(XonLim)を調整する事ができます。
これはXon/Xoffに限らずハードウェアフロー制御にも適用されるようです。
なお受信停止境界(XoffLim)は、停止するときの受信バッファの空き文字数をセットするよう
になっています。
送信フロー制御を行うなら
オーバーラップ入出力を利用するか別スレッドで送信するようにしないと
WriteFileでブロックされてしまうのでその辺も考慮しましょう。
ちなみにWin32のヘルプファイルがあれば、そこに詳しく書いてありますんで探してみてください。
私が使っているのはC++Builder1のCDROMに入っている、おそらくちょっと古いWin32の日本語ヘルプ
です(API32WH.HLP)。開発ツールのパッケージにきっと含まれていると思います。
Microsoftのサイトにも置いてあるかもしれませんね。
では。
--
ひらき ひろもり