我写了/支持一个名为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); } }
但是,正如您可能已经猜到的那样,事实并非如此。 有什么想法吗?
答案 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);