我写/支持称为uCon的terminal仿真器( http://www.umonfw.com/ucon )。 它的全部基于“good-ole”Win32,完全是“C”。 最近我被要求支持将uCon连接到COM端口并为RS232stream量控制以外的目的设置DTR / RTS的能力。 我知道我可以在使用EscapeCommFunction()和/或SetCommState()调用CreateFile()后执行此操作。 但是,这些函数只能在调用CreateFile()函数后返回到打开的端口的句柄。 不幸的是,当CreateFile()打开端口时,它将DTR / RTS设置为它们的默认状态,这可能(也可能不是)与我希望保留DTR的状态不同。
例如,假设用户有一个连接到PC串口的电路板,DTR线用于使电路板处于非标准状态。 DTR处于非活动状态时,电路板运行“正常”,但偶尔使用DTR活动将硬件转换为其他状态。
在大多数情况下,我已经看到,CreateFile()使DTR处于活动状态,然后我的清除DTR的调用将它恢复为非活动状态。 不过,这是我需要避免的一个小故障。 我发现了一个名为GetDefaultCommConfig()&SetDefaultCommConfig()的函数集,但是无法使它们成功工作。 所以,我的问题是…
当调用CreateFile()时,是否有办法预先定义将在RS232控制线上build立的默认状态? 有没有人成功使用GetDefaultCommConfig()/ SetDefaultCommConfig()?
在我看来,这应该允许我预先build立在调用CreateFile()时使用的DTR的值…
INT EstablishDefaultDTR(char * comPortName,int dtr) { COMMCONFIG cc; DWORD bsize = sizeof(COMMCONFIG); if(GetDefaultCommConfig(comPortName,&cc,&bsize)== 0){ ShowLastError( “GetDefaultCommConfig()”); 返回(-1); } 如果(dtr) cc.dcb.fDtrControl = DTR_CONTROL_ENABLE; 其他 cc.dcb.fDtrControl = DTR_CONTROL_DISABLE; 如果(SetDefaultCommConfig(comPortName,&cc,bsize)== 0){ ShowLastError( “SetDefaultCommConfig()”); 返回(-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 ); }
您没有初始化COMMCONFIG结构。 这可能是问题,因为文档明确指出,您必须至少设置dwSize
cc.dwSize = sizeof(COMMCONFIG);