我正在尝试通过我的USB端口(名为COM15)进行一些串行通信,但出现错误。这是发生错误的代码:
HANDLE myPortHandle = CreateFile("COM15",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (myPortHandle == INVALID_HANDLE_VALUE)
{
DWORD lastError = GetLastError();
cout<<"ERROR HERE! = "<<lastError<<endl;
}
每次编译程序时,打开的串口==的句柄INVALID_HANDLE_VALUE。我在 CreateFile() msdn 文档中阅读了使用 GetLastError() 来获取"扩展错误信息"。现在。。。当我运行代码时,GetLastError() 返回的值:2
在 GetLastError() 的 msdn 文档中,它说:
"设置最后一个错误代码的每个函数的文档的返回值部分记录了函数设置最后一个错误代码的条件。"
我尝试在 CreateFile() msdn 文档的返回值部分中查找"2"的含义,但在任何地方都找不到含义。
问题:
1)为什么会这样:myPortHandle == INVALID_HANDLE_VALUE?
2)另外,如果有人可以将我引导到我需要在msdn文档中查找的位置以找到GetLastError()返回的" 2"的含义,那就太棒了!
Windows 错误代码记录在此处:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx
您的错误代码是 ERROR_FILE_NOT_FOUND
。这意味着找不到COM15
。根据本文,您需要使用名称: "\\.\COM15"
.
CreateFile()
可用于获取串行端口的句柄。这 "Win32 Programmer's Reference"条目"CreateFile()"提到 共享模式必须为 0,创建参数必须OPEN_EXISTING, 并且模板必须为 NULL。当您使用 "COM1" 到 "COM9" 时,CreateFile() 是成功的 文件名;但是,消息
INVALID_HANDLE_VALUE
是 如果使用"COM10"或更高版本,则返回。如果端口名称为
\.COM10
,则指定 调用 CreateFile() 时的串行端口如下所示:CreateFile( "\\.\COM10", // address of name of the communications device fdwAccess, // access (read-write) mode 0, // share mode NULL, // address of security descriptor OPEN_EXISTING, // how to create 0, // file attributes NULL // handle of file with attributes to copy );
注意:此语法也适用于端口 COM1 到 COM9。某些板会让您自己选择端口名称。这 语法也适用于这些名称。
或者从文档到CreateFile
本身:
创建文件函数可以创建通信的句柄 资源,例如串行端口 COM1。对于通信资源, dwCreationDisposition参数必须OPEN_EXISTING,即 dwShareMode 参数必须为零(独占访问),并且 h模板文件参数必须为 NULL。读、写或读/写 可以指定访问,并且可以打开句柄以进行重叠 I/O.
若要指定大于 9 的 COM 端口号,请使用以下语法:
\.COM10
.此语法适用于所有端口号和硬件 允许指定 COM 端口号。