2009-06-04 8 views
4

私は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の値を事前に確立できるようにするべきであると私には思える。しかしそれはしません。 アイデア

+0

あなたはここで見たことが:http://msdn.microsoft.com/en-us/library/ms810467.aspx記事はBuildCommDCBを(提供しています)代わりに...おそらくそれはあなたのためのトリックを行うのだろうか? –

+0

@Ed:まったく同じ問題を抱えています。あなたはそれを解決できますか?私は賞金を提供しています。 –

+0

あなたはここを見ましたか:http://www.codeguru.com/forum/showthread.php?t=291244手元に同じ問題があります。しかし、TDMは、ポートを開いた後でDTRをその状態に設定することが唯一の定義方法であると主張しています。 100msのスイッチ・ラグがハードウェアを殺した場合、最初から設計上の欠陥があります。 – Bort

答えて

2

COMMCONFIG構造体を初期化していません。ドキュメントには、少なくともdwSizeを設定する必要があることが明示されているため、問題になる可能性があります。

cc.dwSize = sizeof(COMMCONFIG);

+0

最初の呼び出しがうまく動作しないうちにこれを行うだけです。どちらの呼び出しも0以外の値を返すので、明らかに成功します。 'GetDefaultCommConfig'を呼び出した後、' cc'の内容をチェックしました。私が見た奇妙なことは 'cc.dcb.DCBLength'が' 3435973836'に等しくなったことだけです。最初の呼び出しの前に 'BuildCommDCB'を使ってみるつもりです。他の提案は大歓迎です。 –

+0

回避策を見つけて答えとして投稿しました。賞金が切れるまで待って、誰かがより良い働きをするソリューションを見つけたかどうかを確認します。 –

+0

@dario_ramos BuildCommDCBも機能しませんでしたか? – Danra

3

は最速の方法ではないかもしれないが、これは動作します:

#include <stdlib.h> 
#include <stdio.h> 

int 
EstablishDefaultDTR(char *comPortName, int dtr){ 
    char commandString[256]; 
    if (!system(NULL)){ 
     ShowLastError("system()"); 
     return(-1); 
    }   
    sprintf(commandString, "MODE %s dtr=%s%", comPortName, dtr? "on":"off" ); 
    return system(commandString); 
} 
+0

それはちょうどポートを開いて、DTRの状態を設定していませんか?ポートを開いていれば、 'MODE'コマンドは失敗します。次回にポートを開くと、以前の状態が保持されます。ポートを開いてDTRを設定し、ポートを閉じてコードで再度開くことで、同じ動作を得ることができます。 – tinman

+0

これを開く前にこれを行い、動作します。私は 'CreateFile'の呼び出しが成功したかどうかチェックしませんでしたが、ポートは正しいDTR状態(これは常にDTRセットで開始されています)で開かれ、通信は期待通りに機能します。 –

+0

ポートを開いてDTRをクリアして閉じてからもう一度開くと、DTRが設定されている小さな期間(LEDが点灯し、xrayチューブが0.5秒間回転)に反応することがわかりました。このソリューションでは、それはまったく起こりません。 –

関連する問題