CreateFile 返回错误 INVALID_HANDLE_VALUE(对于 COM 端口),GetLastError 返回“找不到指定的文件”

Posted

技术标签:

【中文标题】CreateFile 返回错误 INVALID_HANDLE_VALUE(对于 COM 端口),GetLastError 返回“找不到指定的文件”【英文标题】:CreateFile returns error INVALID_HANDLE_VALUE (for COM port), and GetLastError returns "can't find file specified" 【发布时间】:2013-01-31 20:54:22 【问题描述】:

我正在打开一个端口与设备通信并控制该设备,但CreateFile() 函数返回INVALID_HANDLE_VALUE

GetLastError() 返回2 表示找不到指定的文件。

我的代码如下所示:

wsprintf( szPort, "COM%d", nPort );
m_hIDComDev = CreateFile(szPort,
                         GENERIC_READ | GENERIC_WRITE, 
                         0, 
                         NULL, 
                         OPEN_EXISTING, 
                         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
                         NULL);
if (m_hIDComDev == INVALID_HANDLE_VALUE)

    DWORD err=GetLastError();

为什么会出现这个问题?

【问题讨论】:

@JesseGood,我修改了我的问题。 我怀疑HOWTO: Specify Serial Ports Larger than COM9 这就是问题所在。 @JesseGood,非常感谢!我发现我的电脑上没有 COM2 端口。那么,我现在能做的就是随机改成我电脑有的端口还是我需要选择一个特定的端口? 嗯,这不取决于你想做什么吗?打开设备管理器查看端口列表。 【参考方案1】:

问题在于您没有为串行端口的lpFileName 指定正确的值。您应该使用这种格式:

"\\\\.\\COM%d"

这将产生一个看起来像\\.\COM1 的字符串,这是正确的格式。

【讨论】:

【参考方案2】:

尝试使用

char *szPort = _T("COM1"); // Change port number to your unused existing port

_T 强制将 szPort 保持为 ASCII。

【讨论】:

我认为这与问题无关。端口字符串不需要使用 ASCII - _T 强制字符串使用当前字符宽度,这可能是 char 或 wchar_t 取决于编译选项,我希望 CreateFile 编译为 CreateFileA 或 CreateFileW 匹配。 _T 的主要目的是它做正确的事情来匹配 Win32 API 调用。

以上是关于CreateFile 返回错误 INVALID_HANDLE_VALUE(对于 COM 端口),GetLastError 返回“找不到指定的文件”的主要内容,如果未能解决你的问题,请参考以下文章

CreateFile 返回无效的句柄值

CreateFile()函数的返回值,具体点的,有例子

CreateFile 失败,错误代码为 2,而文件存在

命名管道 CreateFile() 返回 INVALID_HANDLE_VALUE,GetLastError() 返回 ERROR_PIPE_BUSY

windows编程中的CreateFile 出现5的错误解决方法

windows编程中的CreateFile 出现5的错误解决方法