Eli*_*sky 29 c python windows winapi serial-port
我正在寻找一种强大的方法来列出Windows机器上可用的串行(COM)端口.这篇关于使用WMI的帖子,但我想要一些特定于.NET的东西 - 我想在没有.NET的情况下获得Python或C++程序中的端口列表.
我目前知道另外两种方法:
读取HARDWARE\\DEVICEMAP\\SERIALCOMM注册表项中的信息.这看起来是一个很好的选择,但它是否健壮?我无法在线或在MSDN中找到此注册表单元确实始终包含可用端口的完整列表的保证.
Tryint调用CreateFile上COMN1有N多家的东西.这还不够好,因为某些COM端口未命名为COMN.例如,创建的一些虚拟COM端口名为CSNA0,CSNB0等,因此我不会依赖此方法.
分享任何其他方法/想法/经验?
编辑:顺便说一句,这是一个从注册表中读取端口名称的简单Python实现:
import _winreg as winreg
import itertools
def enumerate_serial_ports():
""" Uses the Win32 registry to return a iterator of serial
(COM) ports existing on this computer.
"""
path = 'HARDWARE\\DEVICEMAP\\SERIALCOMM'
try:
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path)
except WindowsError:
raise IterationError
for i in itertools.count():
try:
val = winreg.EnumValue(key, i)
yield (str(val[1]), str(val[0]))
except EnvironmentError:
break
Run Code Online (Sandbox Code Playgroud)
Mat*_*ams 33
在Python中使用pySerial:
import serial.tools.list_ports
ports = list(serial.tools.list_ports.comports())
for p in ports:
print p
Run Code Online (Sandbox Code Playgroud)
有几种选择:
使用NULL lpDeviceName 调用QueryDosDevice以列出所有DOS设备.然后依次使用CreateFile和GetCommConfig以及每个设备名称来确定它是否是串行端口.
呼叫SetupDiGetClassDevs与GUID_DEVINTERFACE_COMPORT的ClassGuid.
在win32新闻组和CodeProject,er,项目上有一些对话.
我刚刚创建了以下内容,基于将C++源代码读取到EnumSerialPorts并查看函数GetDefaultCommConfig().对于每个可能的COM端口,它看起来像是使用简单ANSI C和单个API调用的最简单方法.
#include <stdio.h>
#include <windows.h>
#include <winbase.h>
BOOL COM_exists( int port)
{
char buffer[7];
COMMCONFIG CommConfig;
DWORD size;
if (! (1 <= port && port <= 255))
{
return FALSE;
}
snprintf( buffer, sizeof buffer, "COM%d", port);
size = sizeof CommConfig;
// COM port exists if GetDefaultCommConfig returns TRUE
// or changes <size> to indicate COMMCONFIG buffer too small.
return (GetDefaultCommConfig( buffer, &CommConfig, &size)
|| size > sizeof CommConfig);
}
int main()
{
int i;
for (i = 1; i < 256; ++i)
{
if (COM_exists( i))
{
printf( "COM%d exists\n", i);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
46288 次 |
| 最近记录: |