CreateFile()串行通信问题

时间:2015-01-12 19:51:07

标签: c++ serial-communication createfile getlasterror

我正在尝试通过我的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()以获取&#34;扩展错误信息&#34;。现在......当我运行代码时,GetLastError()返回一个值:2

在GetLastError()的msdn文档中,它说:

&#34;设置最后错误代码的每个函数的文档的返回值部分说明了函数设置最后错误代码的条件。&#34;

我试着寻找&#39; 2&#39;的含义。在CreateFile()msdn文档的返回值部分,无法在任何地方找到含义。

问题:

1)为什么会发生这种情况:myPortHandle == INVALID_HANDLE_VALUE?

2)此外,如果有人可以指示我在msdn文档中查找的地方,以找到&#39; 2&#39; 2的含义。由GetLastError()返回,这太棒了!

1 个答案:

答案 0 :(得分:9)

Windows错误代码在此处记录:http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382.aspx

您的错误代码为ERROR_FILE_NOT_FOUND。这意味着无法找到COM15。根据{{​​3}},您需要使用名称:"\\\\.\\COM15"

  

CreateFile()可用于获取串行端口的句柄。该   “CreateFile()”的“Win32 Programmer's Reference”条目提到了这一点   共享模式必须为0,create参数必须为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。某些主板会让您自己选择端口名称。这个   语法也适用于这些名称。

或者从文档到this article本身:

  

CreateFile函数可以创建通信句柄   资源,例如串口COM1。对于通信资源,   dwCreationDisposition参数必须是OPEN_EXISTING,即   dwShareMode参数必须为零(独占访问),并且   hTemplateFile参数必须为NULL。读,写或读/写   可以指定访问权限,并且可以打开句柄以进行重叠   I / O。

     

要指定大于9的COM端口号,请使用以下语法:   \\.\COM10。此语法适用于所有端口号和硬件   允许指定COM端口号。