Winapi 在Win32中侦听通信端口和stdin
我正在尝试编写一个小实用程序,它使用Win32 API将stdin/stdout映射到串行端口(某种命令行终端仿真器)。我有以下代码,我认为应该可以工作,但它似乎没有正确地从串行端口接收通知:Winapi 在Win32中侦听通信端口和stdin,winapi,serial-port,polling,waitformultipleobjects,Winapi,Serial Port,Polling,Waitformultipleobjects,我正在尝试编写一个小实用程序,它使用Win32 API将stdin/stdout映射到串行端口(某种命令行终端仿真器)。我有以下代码,我认为应该可以工作,但它似乎没有正确地从串行端口接收通知: HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); HANDLE hCom = CreateFile(com_name, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, 0, NULL); /*
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hCom = CreateFile(com_name, GENERIC_READ | GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, 0, NULL);
/* check for errors opening the serial port, configure, set timeouts, etc */
HANDLE hWaitHandles[2];
hWaitHandles[0] = hStdin;
hWaitHandles[1] = hCom;
DWORD dwWaitResult = 0;
for (;;) {
dwWaitResult = WaitForMultipleObjects(2, hWaitHandles, FALSE, INFINITE);
if(dwWaitResult == WAIT_OBJECT_0)
{
DWORD bytesWritten;
int c = _getch();
WriteFile(hCom, &c, 1, &bytesWritten, NULL);
FlushConsoleInputBuffer( hStdin);
} else if (dwWaitResult == WAIT_OBJECT_0+1) {
char byte;
ReadFile(hCom, &byte, 1, &bytesRead, NULL);
if (bytesRead)
printf("%c",byte);
}
}
你知道我做错了什么吗?如果我没记错的话,你需要使用重叠I/O进行串行端口访问,这样一切才能正常工作。这通常意味着您需要创建一个单独的线程来处理串行端口输入。我不记得确切的原因,但使用
WaitForMultipleObjects
时串行端口会出现问题。WaitForMultipleObjects的文档说以下内容是可等待的:
* Change notification
* Console input
* Event
* Memory resource notification
* Mutex
* Process
* Semaphore
* Thread
* Waitable timer
请注意,没有提到文件和通信端口。hrmm。我试图避免这样做;对于这样一个(看似?)简单的任务来说,似乎有点过分了;我后来意识到了这一点。我仍然在考虑posix的select()。从技术上讲,WaitForMultipleObjects是在传递给ReadFile()或WriteFile()的重叠事件上完成的,而不是在端口本身上。