私はuCon(http://www.umonfw.com/ucon)というターミナルエミュレータを書きました。そのすべては "good-ole" Win32に基づいており、完全に 'C'になっています。私は最近、uPortをCOMポートに接続し、RS232フロー制御以外の目的でDTR/RTSを設定する機能をサポートするように求められました。 CreateFile()がEscapeCommFunction()および/またはSetCommState()を使用して呼び出された後、私はこれを行うことができることを知っています。ただし、これらの関数は、後で呼び出すことができます。CreateFile()は、開いているポートへのハンドルを返します。残念なことに、CreateFile()がポートを開くと、DTR/RTSをデフォルト状態に設定します.DTRを保持したい状態とは異なる場合があります(CreateFile()がCOMポートを開くときに使用するDTR/RTS状態を設定する方法
)たとえば、ボードがPCのシリアルポートに接続されていて、DTRラインがボードを何らかの非標準状態にするために使用されます。 DTRがアクティブでない場合、ボードは「正常」に実行されますが、DTRをアクティブにしてハードウェアを他の状態に移行させることがあります。
ほとんどの場合、CreateFile()はDTRをアクティブにしていますが、クリアDTRを呼び出すと無効に戻ります。しかし、それは私が避ける必要がある不具合です。私はGetDefaultCommConfig()& SetDefaultCommConfig()と呼ばれる機能セットを見つけましたが、正常に動作するようにはできませんでした。だから、私の質問はこれ...
CreateFile()が呼び出されたときにRS232コントロールラインで設定されるデフォルト状態を事前定義する方法はありますか?誰もGetDefaultCommConfig()/ SetDefaultCommConfig()を使用しましたか?あなたは既に推測していることとして
int EstablishDefaultDTR(char *comPortName, int dtr) { COMMCONFIG cc; DWORD bsize = sizeof(COMMCONFIG); if (GetDefaultCommConfig(comPortName,&cc,&bsize) == 0) { ShowLastError("GetDefaultCommConfig()"); return(-1); } if (dtr) cc.dcb.fDtrControl = DTR_CONTROL_ENABLE ; else cc.dcb.fDtrControl = DTR_CONTROL_DISABLE ; if (SetDefaultCommConfig(comPortName,&cc,bsize) == 0) { ShowLastError("SetDefaultCommConfig()"); return(-1); } }
...これは私がのCreateFile()が呼び出されたときに使用 をするDTRの値を事前に確立できるようにするべきであると私には思える。しかしそれはしません。 アイデア
あなたはここで見たことが:http://msdn.microsoft.com/en-us/library/ms810467.aspx記事はBuildCommDCBを(提供しています)代わりに...おそらくそれはあなたのためのトリックを行うのだろうか? –
@Ed:まったく同じ問題を抱えています。あなたはそれを解決できますか?私は賞金を提供しています。 –
あなたはここを見ましたか:http://www.codeguru.com/forum/showthread.php?t=291244手元に同じ問題があります。しかし、TDMは、ポートを開いた後でDTRをその状態に設定することが唯一の定義方法であると主張しています。 100msのスイッチ・ラグがハードウェアを殺した場合、最初から設計上の欠陥があります。 – Bort