2009-06-04 69 views
1

通常,在PC上,有一些非标准的COM端口可供终端仿真器使用。我希望能够扫描端口COM1-COM32以查看哪些(如果有)这些端口可以作为串行端口打开。我可以这么做,只需在所有这些端口上调用CreateFile()即可;然而,我实际上必须暂时打开/关闭(并影响DTR/RTS)端口。我可以检查一下COM端口是否可以在没有打开的情况下打开吗?

我想为可用端口的用户提供一个准确的列表。问题是我不想影响当前未被使用的端口的DTR/RTS线,因为可能有硬件连接到那些不希望在DTR/RTS上看到任何转换的端口。

有没有办法只问这个问题:“CreateFile()会成功吗?”在指定的COM端口?

回答

1

几种方法

一)QueryDosDevice() - 核对COM的名字

B)GetDefaultCommConfig() - 我们将向您所有可能的序列名称,如。试图让配置为COM1,COM2,... COMN

C)HKLM /硬件/ DEVICEMAP/SERIALCOMM - 枚举密钥

d)SETUPAPI - 如果我会记得如何使用这个没有广泛谘询参考手册我不会是人类

e)???

编辑:如Peter指出的,除了枚举之外,没有功能可以告诉您是否可以访问设备。

+0

我在这里知道的唯一一个是GetDefaultCommConfig(),虽然API足够简单,但我还没有能够得到这个返回成功迄今。有一个窍门吗?它只是一个字符串,后面是一个指向结构的指针,后面跟着一个指向填充大小值(结构体)的指针。似乎很简单,但我无法实现它的工作。 谢谢, – 2009-06-04 21:20:54

+0

我使用的代码片段如下...如果您发现错误,请大声呼喊! :-) void somefunc(void) COMMMONFIG cc; DWORD bsize = sizeof(COMMCONFIG);如果(GetDefaultCommConfig(“COM1”,&cc,&bsize)== 0){0} ShowLastError(“GetDefaultCommConfig()”); return; } ... } – 2009-06-04 21:24:45

2

不,没有办法提出这样的问题。无论如何,答案不会有意义。即使操作系统确定在某个时间点打开COM端口也会成功,但这并不意味着您可以稍后打开它。 (例如,它可能会被另一个应用程序打开。)您可以使用SetupDiXXX函数来枚举系统中的COM端口,但这实际上只是返回有关已安装驱动程序和活动驱动程序的信息。除此之外,它不提供任何保证。

0

HKLM/HARDWARE/DEVICEMAP/SERIALCOMM是我的最爱。

该解决方案显示了最佳的易于实施与IMO准确度比率。

尽管我已经看到至少有一家USB到串行端口的制造商(其硬件并不总是列在那里)(FTDI IIRC),但它在大多数情况下足够准确。

相关问题