【问题标题】:Flush communications handle receive buffer?刷新通信句柄接收缓冲区?
【发布时间】:2009-04-01 22:35:35
【问题描述】:

在 Win32 C 中是否有一个 API 调用来刷新(转储)COM 端口接收缓冲区的内容?我只能找到刷新传输缓冲区的函数。

【问题讨论】:

    标签: c windows winapi


    【解决方案1】:

    `PurgeComm()' 可以丢弃 Tx 和 Rx 缓冲区中的一个或两个中的所有字符,并中止端口上的任何挂起的读取和/或写入操作。要对端口执行所有操作,可以这样说:

    PurgeComm(hPort, PURGE_RXABORT|PURGE_TXABORT|PURGE_RXCLEAR|PURGE_TXCLEAR) 
    

    您可能还想确保您已经处理或明确忽略了端口上的任何未决错误,可能是ClearCommError()

    ReadFile() 可用于通过将所有可用字节读入废物缓冲区来清空 Rx 缓冲区和 FIFO。请注意,您可能需要具备“非自然”知识才能正确调整该缓冲区的大小,或者重复 ReadFile() 调用直到它没有更多可说的内容。

    但是,读取缓冲区以刷新它只有在您首先“合理地”设置COMMTIMEOUTS 时才有意义,否则读取将阻塞直到缓冲区被填满。

    【讨论】:

      【解决方案2】:

      刷新接收缓冲区没有意义,要从 com 端口接收缓冲区中获取数据,只需在 com 端口的句柄上调用 ReadFile

      FlushFileBuffers 同步强制传输传输缓冲区中的数据

      PurgeComm 清空缓冲区而不发送或接收(基本上是删除)

      【讨论】:

      • 是的,但是如果您使用读取文件,您将依赖 COMMTIMEOUTS,这会减慢我的应用程序。缓冲区中有我不想阅读的垃圾。如果我使用读取文件,读取将等待,否则我将不得不不断更改 COMMTIMEOUTS,而 Windows 只能如此快。
      • 上下文中的术语刷新和转储指的是实际移动或保存缓冲区而不是使其无效/清除,特别是考虑到您如何将刷新与传输缓冲区结合使用,这绝对不仅仅是使缓冲区无效而是保证传输
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2011-11-28
      相关资源
      最近更新 更多