【发布时间】:2009-06-04 14:39:53
【问题描述】:
我编写/支持了一个名为 uCon (http://www.umonfw.com/ucon) 的终端仿真器。它全部基于“good-ole”Win32,并且完全在'C'中。我最近被要求支持将 uCon 连接到 COM 端口并设置 DTR/RTS 以用于 RS232 流控制之外的目的。我知道我可以在使用 EscapeCommFunction() 和/或 SetCommState() 调用 CreateFile() 之后执行此操作;但是,这些函数只能在 CreateFile() 返回打开端口的句柄之后调用。不幸的是,当 CreateFile() 打开端口时,它会将 DTR/RTS 设置为其默认状态,这可能(也可能不会)与我希望保留 DTR 的状态不同。
例如,假设用户有一块板子连接到 PC 的串口,并且 DTR 线用于将板子置于一些非标准状态。 DTR 不活动时,板子运行“正常”,但偶尔 DTR 活动用于将硬件转换到其他状态。
在我见过的大多数情况下,CreateFile() 使 DTR 处于活动状态,然后我调用 clear DTR 使其恢复为非活动状态;但是,这是我需要避免的故障。我找到了一个名为 GetDefaultCommConfig() 和 SetDefaultCommConfig() 的函数集,但无法让它们成功工作。所以,我的问题是……
有没有办法预先定义调用 CreateFile() 时将在 RS232 控制线上建立的默认状态?有没有人成功使用过GetDefaultCommConfig()/SetDefaultCommConfig()?
在我看来,这应该允许我预先确定 DTR 的值是 调用 CreateFile() 时使用...
整数 建立DefaultDTR(char *comPortName, int dtr) { 通讯配置 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 ; if (SetDefaultCommConfig(comPortName,&cc,bsize) == 0) { ShowLastError("SetDefaultCommConfig()"); 返回(-1); } }但是,您可能已经猜到了,事实并非如此。 有什么想法吗?
【问题讨论】:
-
你看过这里吗:msdn.microsoft.com/en-us/library/ms810467.aspx 这篇文章提供了 BuildCommDCB() 作为替代方案......也许这对你有用?
-
@Ed:我遇到了完全相同的问题。你能解决吗?我提供赏金。
-
你看过这里吗:codeguru.com/forum/showthread.php?t=291244 手头有同样的问题。然而,TDM 声称在打开端口后将 DTR 设置为其状态是唯一定义的方法。如果 100 毫秒的开关延迟导致硬件失效,那么从一开始就存在设计缺陷。
-
@Bort:在我的情况下,它不会杀死它,它只会让 X 射线管无用地旋转,应该避免但不是致命的。我同意你的观点,但无论如何,
MODE解决方案非常有效。
标签: c++ c windows serial-port