2

我想从连接到 COM 端口的设备中读取一些数据。

  • HANDLE handle =CreateFileW(L"\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

    给我一个有效HANDLE的,然后通过GetCommStateand配置SetCommState

  • OVERLAPPED ol = {0};

    char buffer[1024];

    ol.Offset = 0;

    ol.OffsetHigh = 0;

    ReadFileEx(handle, buffer, 1, &ol, NULL);

    问题是,这个调用没有成功并GetLastError()返回 87 ( ERROR_INVALID_PARAMETER)。

我可以尝试从设备中读取什么内容?

4

2 回答 2

1

在 MS 的实现中也存在一个错误ReadFileEx。尽管文档明确指出不应完全回复BOOL返回结果,并且还应检查GetLastError()实现未能清除任何预先存在的错误。SetLastError(ERROR_SUCCESS)在调用之前添加一个ReadFileEx()

于 2011-08-07T02:41:03.460 回答
1

ReadFileEx 文档指出

ReadFileEx 函数忽略 OVERLAPPED 结构的 hEvent 成员。在 ReadFileEx 调用的上下文中,应用程序可以自由地将该成员用于自己的目的。ReadFileEx 通过调用或排队调用 lpCompletionRoutine 指向的完成例程来表示其读取操作的完成,因此它不需要事件句柄。

因此,尽管它还说完成例程是可选的,但它可能是必需的。另请注意您链接到的页面底部的社区评论 - MS 可能已通过将 NULL lpCompletionRoutine 视为错误来修复该崩溃。但是,我还没有测试它来验证。

如果您不使用完成例程,则可以使用普通的 ReadFile 进行重叠操作。

于 2011-07-12T09:06:15.953 回答