c++ - CreateFile 无法共享串行 (COM) 端口

标签 c++ winapi serial-port createfile

CreateFile函数可用于打开文件或设备进行读/写访问,提供句柄。

第三个参数,dwShareMode,指定文件/设备以后是否可以被其他人访问。一个例子,文件:

void* pFileHandle1 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
DWORD lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pFileHandle2 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS

一切都很好:我们有 2 个不同的句柄可以读/写一个文件。

但就我而言,我想使用 COM 端口:

void* pComHandle1 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pComHandle2 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 5, ERROR_ACCESS_DENIED Oops!

第一个句柄有效,可以使用,但第二个句柄为INVALID_HANDLE_VALUE。

这是怎么回事?不能那样共享 COM 端口吗?

最佳答案

引用 CreateFile 的文档:

The CreateFile function can create a handle to a communications resource, such as the serial port COM1. For communications resources, the dwCreationDisposition parameter must be OPEN_EXISTING, the dwShareMode parameter must be zero (exclusive access), and the hTemplateFile parameter must be NULL. Read, write, or read/write access can be specified, and the handle can be opened for overlapped I/O.

此处文档的含义是通信对象不能像普通文件一样共享。 Windows API 让打开端口的人决定他们如何/是否要共享对该资源的访问,并让他们管理该决定的后果。

要共享端口,您可以使用 DuplicateHandle 并在打开端口后将其传递给您想要授予端口访问权限的任何人。如需进一步阅读,请查看此 ancient article from MSDN

就是说,如果您想在多个进程之间共享一个 COM 端口,最好只在其中一个进程中打开它,并使用某种形式的 IPC 来传输数据。让一个进程处理端口服务。

关于c++ - CreateFile 无法共享串行 (COM) 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50215937/

相关文章:

c++ - How to get around GCC ‘*((void*)& b +4)’ may be used uninitialized in this function warning while using boost::optional

python - 串行读/写代码中可能存在的竞争条件

Python:尝试打开串行导致IOError:[Errno 6]设备未配置

python - ccTalk 硬币接收器插入硬币时没有反应

c++ - 我的编译器会重新排序这个表达式吗?

c++ - 写入未打开的 std::ofstream

c++ - 什么是 unicode/unistr.h?

winapi - FASM - 如果文件存在 - 使用 GetFileAttributes - INVALID_FILE_ATTRIBUTES 值?

c++ - 如何获取打印机类别(类型)?

c++ - 我可以将从相机获取的单 channel 图像输出到 winAppi 窗口吗?