如何设置将在CreateFile()打开COM端口时使用的DTR / RTS状态

时间:2009-06-04 14:39:53

标签: c++ c windows serial-port

我写了/支持一个名为uCon(http://www.umonfw.com/ucon)的终端模拟器。它全部基于“good-ole”Win32,完全是'C'。我最近被要求支持将uCon连接到COM端口并为RS232流量控制之外的目的设置DTR / RTS的能力。我知道在使用EscapeCommFunction()和/或SetCommState()调用CreateFile()之后我可以这样做;但是,这些函数只能被调用AFTER CreateFile()返回打开端口的句柄。不幸的是,当CreateFile()打开端口时,它将DTR / RTS设置为默认状态,这可能(或可能不)与我希望保留DTR的状态不同。

例如,假设用户的电路板连接到PC的串行端口,DTR线用于将电路板置于某种非标准状态。在DTR无效的情况下,电路板运行“正常”,但偶尔使用DTR激活将硬件转换到其他状态。

在大多数情况下,我看到,CreateFile()使DTR处于活动状态,然后我对清除DTR的调用将其恢复为非活动状态;然而,这是一个我需要避免的故障。我找到了一个名为GetDefaultCommConfig()&的函数集。 SetDefaultCommConfig()但未能使它们成功运行。所以,我的问题是......

有没有办法预先定义在调用CreateFile()时将在RS232控制线上建立的默认状态?有没有人成功使用过GetDefaultCommConfig()/ SetDefaultCommConfig()?

在我看来,这应该允许我预先建立DTR的价值 在调用CreateFile()时使用...

 
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);
    }
}

但是,正如您可能已经猜到的那样,事实并非如此。 有什么想法吗?

2 个答案:

答案 0 :(得分: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 );
}

答案 1 :(得分:2)

您没有初始化COMMCONFIG结构。这可能是问题,因为文档明确说明你必须至少设置dwSize

cc.dwSize = sizeof(COMMCONFIG);