我编写/支持了名为uCon(http://www.umonfw.com/ucon)的终端仿真器。它全部基于Win32的“good-ole”,并且完全在“C”中。最近有人要求我支持将uCon连接到COM端口并为RS232流量控制之外的目的设置DTR/RTS的功能。我知道可以在使用EscapeCommFunction()和/或SetCommState()调用CreateFile()之后执行此操作;但是,只能在AFTER CreateFile()返回打开的端口的句柄之后调用这些函数。不幸的是,当CreateFile()打开端口时,它将DTR/RTS设置为其默认状态,该状态可能(也可能不会)不同于我希望保留DTR的状态。
例如,假设用户有一块板连接到PC的串行端口,并且DTR线用于将板置于某种非标准状态。如果DTR处于非 Activity 状态,则板卡将“正常”运行,但是偶尔会使用DTR-active来将硬件转换为其他状态。
在大多数情况下,我已经看到CreateFile()使DTR处于 Activity 状态,然后调用clear DTR使其回到非 Activity 状态;但是,这是我需要避免的故障。我找到了一个名为GetDefaultCommConfig()和SetDefaultCommConfig()的函数集,但无法使它们成功工作。所以,我的问题是...
有没有一种方法可以预定义在调用CreateFile()时将在RS232控制线上建立的默认状态?有人成功使用GetDefaultCommConfig()/SetDefaultCommConfig()吗?
在我看来,这应该允许我预先确定DTR的值(value)
在调用CreateFile()时使用...
整型
BuildDefaultDTR(char * comPortName,int dtr)
{
COMMCONFIG抄送;
DWORD bsize = sizeof(COMMCONFIG);
如果(GetDefaultCommConfig(comPortName,&cc,&bsize)== 0){
ShowLastError(“GetDefaultCommConfig()”);
return(-1);
}
如果(dtr)
cc.dcb.fDtrControl = DTR_CONTROL_ENABLE;
别的
cc.dcb.fDtrControl = DTR_CONTROL_DISABLE;
如果(SetDefaultCommConfig(comPortName,&cc,bsize)== 0){
ShowLastError(“SetDefaultCommConfig()”);
return(-1);
}
}
但是,您可能已经猜到了,但事实并非如此。
有任何想法吗?
最佳答案
可能不是最快的方法,但这可行:
#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 );
}