2

我想使用事件/中断从串行读取和写入。目前,我在一个while循环中使用它,它通过串行连续读写。我希望它仅在来自串行端口的内容时读取。如何在 C++ 中实现它?

这是我当前的代码:

    而(真)
    {
        //读
        if(!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //错误发生。向用户报告。
        }

        //写
        if(!WriteFile(hSerial, szBuff, n, &dwBytesRead, NULL)){
        //错误发生。向用户报告。
        }


        //打印你正在阅读的内容
        printf("%s\n", szBuff);

    }
4

4 回答 4

0

使用一个select语句,它会在不阻塞的情况下检查读写缓冲区并返回它们的状态,所以你只需要在知道端口有数据时读取,或者在知道输出缓冲区有空间时写入。

http://www.developerweb.net/forum/showthread.php?t=2933上的第三个示例和相关评论可能会有所帮助。

编辑: select 的手册页在结尾处有一个更简单、更完整的示例。如果在您的系统上不起作用,您可以在http://linux.die.net/man/2/select找到它。man 2 select

注意:掌握select()将允许您使用串行端口和套接字;它是许多网络客户端和服务器的核心。

于 2008-11-01T00:51:20.027 回答
0

对于 Windows 环境,更原生的方法是使用异步 I/O。在这种模式下,您仍然使用对 ReadFile 和 WriteFile 的调用,但不是阻塞,而是传入一个将在操作完成时调用的回调函数。

但是,要正确处理所有细节是相当棘手的。

于 2008-11-01T01:31:51.553 回答
0

这是几年前在 c/C++ 用户杂志上发表的一篇文章的副本。它详细介绍了 Win32 API。

于 2008-11-01T02:57:05.733 回答
0

这里有一个代码在windows上使用中断读取串行传入数据你可以看到在等待中断时间内经过的时间

int pollComport(int comport_number, LPBYTE buffer, int size) { BYTE Byte; DWORD dwBytesTransferred; DWORD dwCommModemStatus; int n; double TimeA,TimeB; // Specify a set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR ); while (m_comPortHandle[comport_number] != INVALID_HANDLE_VALUE) { // Wait for an event to occur for the port. TimeA = clock(); WaitCommEvent (m_comPortHandle[comport_number], &dwCommModemStatus, 0); TimeB = clock(); if(TimeB-TimeA>0) cout <<" ok "<<TimeB-TimeA<<endl; // Re-specify the set of events to be monitored for the port. SetCommMask (m_comPortHandle[comport_number], EV_RXCHAR); if (dwCommModemStatus & EV_RXCHAR) { // Loop for waiting for the data. do { ReadFile(m_comPortHandle[comport_number], buffer, size, (LPDWORD)((void *)&n), NULL); // Display the data read. if (n>0) cout << buffer <<endl; } while (n > 0); } return(0); } }

于 2013-01-31T10:54:32.443 回答