串口:ReadFile 和 CloseHandle [重复]

Posted

技术标签:

【中文标题】串口:ReadFile 和 CloseHandle [重复]【英文标题】:serial port: ReadFile and CloseHandle [duplicate] 【发布时间】:2014-02-10 18:00:50 【问题描述】:

我想读取串行端口的传入数据并处理它们(Windows:本机 C++)。但是我有两个问题:

1- 我应该在ReadFile 中输入 nNumberOfBytesToRead 的内容:

ReadFile( hCom, buffer, nNumberOfBytesToRead, &read, NULL );

如果我把 50 和 40 字节到达,ReadFile 将不会返回。因为它需要多 10 个字节。如果我输入 1,我的应用程序将不会被优化。最好的数字是多少?我该怎么办?

2- 当我想退出我的应用程序时,如果没有数据通过串口,ReadFile 将被锁定而不返回。所以我无法使用 CloseHandle 正确关闭它。如何在通过串口等待数据时强制 ReadFile 返回?

【问题讨论】:

***.com/questions/6036716/… 【参考方案1】:

1 - 没有最好的数字。您最好使用另一种 IO 策略,例如重叠IO,从端口读取数据。 Here's some sample code.

2 - 在这种情况下,您可以并且应该使用 CloseHandle 调用来关闭它。当您这样做时,ReadFile 或其他涉及您刚刚关闭的句柄的阻塞 API 上阻塞的线程将在接收失败的结果代码时唤醒。

【讨论】:

【参考方案2】:

当您打开端口时,您应该使用 SetCommTimeouts。读取超时类似于延迟设置:如果传入数据暂停,ReadFile 在返回之前应该等待多长时间。调整缓冲区大小和超时时间,以适应在处理所获得的任何内容之前愿意等待的毫秒数。

【讨论】:

是的,另一个可行的选择 - 我忘了这个。

以上是关于串口:ReadFile 和 CloseHandle [重复]的主要内容,如果未能解决你的问题,请参考以下文章

VS或者VC6.0编写的C语言程序,怎样能够实现串口数据的收发?

ReadFile串口设备延迟不一致

windows下的串口编程,串口操作类封装

Arduino串口读取

在不使用 readfile() 的情况下检测 Windows 句柄上的空缓冲区

用C语言读取串口数据