我有一个简单的应用程序,它应该每分钟向串行端口发送一个字节。但有时,由于某种奇怪的原因,它在WriteFile()函数中的某处冻结。sw和hw流量控制均关闭。我在谷歌上搜索了一些从其他线程执行的挂起的读取操作,但我相信这不是问题,因为我的应用程序是单线程的。此外,来自CreateFile的句柄看起来是有效的,因此该端口不应该被任何其他应用程序使用。有没有人遭受过这种痛苦?
发布于 2008-10-30 22:54:16
如果你在谷歌上搜索writefile挂起这个词,你会发现很多关于这个问题的讨论。一些线索是缓冲区溢出、正确调整缓冲区大小、COM端口有缺陷、错误时清除状态...似乎有很多东西可以尝试。
我建议的另一件事是使用通信库,而不是直接调用API,比如Async Professional (http://sourceforge.net/projects/tpapro/)。即使它们给您的应用程序增加了一些开销,它们也可能简化您的工作并避免一些潜在的陷阱……
发布于 2008-10-30 20:21:03
我使用的是这个库:在Windows XP上的Delphi7中的http://lhdelphi.ic.cz/uploader/storage/ComDrv32.pas,但里面的组件只是一些Win调用、CreateFile、WriteFile等的包装器。
发布于 2008-10-30 23:16:51
您是否已尝试将CommPortDriver.CheckLineStatus设置为true (“防止在未连接设备或设备关闭时挂起”)?comdrv32.pas库的源代码包含了这个建议。
https://stackoverflow.com/questions/251594
复制相似问题