2

您好,我有一个关于从通信端口异步读取的问题。

我有一个函数,它应该从通信端口异步读取一个字节。该函数大约每 10 毫秒调用一次。我尝试同步执行,但缓冲区溢出,因为调用该函数的速度比它可以完成的速度快。现在我想异步实现它。但不明白它是如何工作的。

我的函数调用(每 10 毫秒调用一次):

// read one byte into receiveChar
bytesReceived = BSP_cliGetChar(&receiveChar);

函数体

int BSP_cliGetChar(char *rxBuffer)
{
DWORD numOfBytesRead;
OVERLAPPED readOverlapped;
HANDLE hEvent;
BOOL fOverlapped;
char str[255];

hEvent = CreateEvent(NULL,    // default security attribute
                     TRUE,    // manual-reset event 
                     TRUE,    // initial state = signaled 
                     NULL);   // unnamed event object 

// set up overlapped structure fields
readOverlapped.Offset     = 0; 
readOverlapped.OffsetHigh = 0; 
readOverlapped.hEvent     = hEvent; 

if (!ReadFile(hComm, rxBuffer, 1, &numOfBytesRead, &readOverlapped))
{
  if (GetLastError() != ERROR_IO_PENDING)
  {
     // Some other error occurred while reading the file.
     ExitProcess(0);
  }
  else
     fOverlapped = TRUE;
}
else
{
  // Operation has completed immediately.
  fOverlapped = FALSE;
  return (int) numOfBytesRead;
}
while(!HasOverlappedIoCompleted(&readOverlapped))
{
   sprintf_s(str, "%d", &numOfBytesRead);
   OutputDebugString(str);
}

}

现在我想要的是从 com 端口读取一个字节。如果返回 ERROR_IO_PENDING,调用函数应该继续。只有接收到一个字节,BSP_cliGetChar 函数才应该返回。问题是,该方法停留在 while 循环中,而不是继续调用过程。

任何有想法如何解决这个问题的人?

谢谢您的帮助。

4

1 回答 1

1

我把你的代码扔进了一个具有以下主要功能的项目中

BSP_cliGetChar(char *rxBuffer);

HANDLE hComm;

int main() {
    char buf;
    DWORD numRead;

    hComm = CreateFile(
        "COM2",
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        NULL);
    if (hComm == INVALID_HANDLE_VALUE)
    {
        printf("error createfile: %d\n", GetLastError());
        return 1;
    }

    do
    {
        BSP_cliGetChar(&buf);
        printf("%c", buf);
    } while (buf != 'X');

    CloseHandle(hComm);
    return 0;
}

我使用虚拟串行端口驱动程序创建了一对链接的 COM 端口 COM1 和 COM2。我用PuTTY打开 COM1,然后运行我的程序。正如预期的那样,我坐在 HasOverlappedIoCompleted 循环中。一旦我通过 PuTTY 发送一个字符,循环就会退出并且我的字符被打印出来。

这就是说我不知道​​你的环境,它可能与你的实际硬件和在你的代码中正确配置你的 COM 端口有关。MSDN提供了有关配置串行通信的大量信息,并特别注意设备控制块 (DCB) 结构

希望有帮助。也许您可以为您的场景提供更多细节。

于 2016-11-11T15:55:38.153 回答