清空通信句柄接收缓冲区?

3
在Win32的C语言中,是否有API调用可以刷新(清空)COM端口接收缓冲区的内容?我只能找到清空发送缓冲区的函数。
2个回答

8

`PurgeComm()'可以清空串口的发送和接收缓冲区,并且中止任何正在进行的读写操作。要对一个端口执行所有操作,可以这样说:

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

你可能还需要确保已经处理或明确忽略了端口上任何挂起的错误,可能需要使用ClearCommError()ReadFile() 可用于通过将所有可用字节读入废缸中来清空仅 Rx 缓冲区和 FIFO。请注意,您可能需要具有“不自然”的知识才能正确地调整该缓冲区的大小,或重复 ReadFile() 调用,直到它没有更多内容为止。
但是,只有在您首先“合理地”设置COMMTIMEOUTS 或读取将有意义,否则读取将阻塞直到缓冲区填满。

0

清空接收缓冲区没有意义,要从串口接收缓冲区获取数据,只需在串口句柄上调用ReadFile即可

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

PurgeComm清空缓冲区而不进行传输或接收(基本上是删除操作)


是的,但如果您使用read file,您将依赖于COMMTIMEOUTS,这会减慢我的应用程序。 缓冲区中会留下我不想读取的垃圾。 如果我使用read file,则读取将等待,或者我将不得不不断更改COMMTIMEOUTS,而Windows只能如此快地执行此操作。 - myforwik
在上下文中,“flush”和“dump”这两个术语指的是实际移动或保存缓冲区,而不是使其无效/清除,特别是考虑到您如何将“flush”与传输缓冲区连接在一起使用,它绝对不仅仅是使缓冲区无效,而是保证传输。 - mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接