我使用以下代码验证计算机上的串行端口名称是否有效:
typedef std::pair<StrAsc const, bool> port_pair_type;
typedef std::list<port_pair_type> port_pairs_type;
port_pairs_type pairs;
StrBin config_buffer;
config_buffer.fill(0,sizeof(COMMCONFIG));
while(!pairs.empty())
{
port_pair_type pair(pairs.front());
pairs.pop_front();
if(!pair.second)
{
// we need to get the default configuration for the port. This may
// require some fudging on the buffer size. That is why two calls
// are being made.
uint4 config_size = config_buffer.length();
StrUni temp(pair.first);
COMMCONFIG *config(reinterpret_cast<COMMCONFIG *>(config_buffer.getContents_writable()));
config->dwSize = sizeof(COMMCONFIG);
rcd = GetDefaultCommConfigW(
temp.c_str(), config, &config_size);
if(!rcd && config_buffer.length() < config_size)
{
config_buffer.fill(0, config_size);
config = reinterpret_cast<COMMCONFIG *>(config_buffer.getContents_writable());
config->dwSize = sizeof(COMMCONFIG);
rcd = GetDefaultCommConfigW(
temp.c_str(),
reinterpret_cast<COMMCONFIG *>(config_buffer.getContents_writable()),
&config_size);
}
// if the call succeeded, we can go ahead and look at the
// configuration structure.
if(rcd)
{
COMMCONFIG const *config = reinterpret_cast<COMMCONFIG const *>(
config_buffer.getContents());
if(config->dwProviderSubType == PST_RS232)
port_names.push_back(pair.first);
}
else
{
OsException error("GetDefaultCommConfig Failed");
trace("\"%s\"", error.what());
}
}
else
port_names.push_back(pair.first);
}
在Windows 10上,当尝试确认使用usbser.sys的串行端口时,对GetDefaultCommConfig()的调用失败,GetLastError()返回的错误代码为87(无效参数)。据我所知,usbser.sys驱动程序已在Windows 10上重写,我怀疑这是该驱动程序的问题。是否有其他人知道可能出现的问题?
答案 0 :(得分:3)
这是usbser.sys
中的一个错误,并已于2016年1月27日在Windows 10更新KB3124262
中修复。
微软员工解释说:
HKLM \ HARDWARE \ DEVICEMAP \ SERIALCOMM注册表中的COM端口名称未以NULL结尾。
由于Windows 10的更新政策,此问题将来不再出现。
答案 1 :(得分:-1)
当您第二次调用GetDefaultCommConfigW时,可能需要config->dwSize
到新大小的结构。例如:
config->dwSize = config_size;