You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cygwin环境下串口C程序第二次运行时read操作挂起的问题求助

Cygwin环境下串口C程序第二次运行时read操作挂起的问题求助

我现在在Cygwin环境下开发一个和USB modem通信的C程序,用到了termios库。程序的串口操作流程大概是这样的:

首先打开串口:

fuart = open(device, O_RDWR | O_NOCTTY | O_SYNC);

之后会循环进行写操作:

write(fuart, str, xlen);

以及读操作:

ln = read(fuart, buff, n);

程序结束时的清理代码是:

tcflush(fuart,TCIOFLUSH);
close(fuart);
sleep(2); // 保险起见加的延迟

现在遇到的问题是:第一次运行程序完全正常,读写都没问题,但第二次用完全相同的参数运行时,程序会卡在read操作上挂起。

我试过一个临时解决办法:在Windows设备管理器里禁用再启用对应的COM口,之后程序就能正常运行了。

一开始我以为是程序没有正确释放串口,导致端口被锁定,但奇怪的是,这种情况下像teraterm这类第三方终端软件依然能正常打开这个串口。更有意思的是:当第二次运行程序挂起后,我用任务管理器强制结束程序,再用第三方终端打开串口,能看到我的程序刚才写进去的数据。

这说明问题应该出在我的程序对串口的关闭/清理流程上,而不是系统或平台的问题——毕竟其他软件都能正常操作串口。而且第一次运行时程序是能正常完成多次读写的,只是第二次运行就会卡在read上。

我查了很多资料,大部分建议都是要正确关闭串口,但我已经做了close操作了。也看到有人遇到类似问题,只能用禁用再启用设备的办法,但像mobastorm这种同样基于Cygwin运行时的软件就没有这个问题,这说明肯定有正确的处理方式。

有没有人遇到过类似的问题?或者能帮我分析下,是不是我的清理步骤漏掉了什么,比如没有正确释放读缓冲区,或者串口关闭的方式在Cygwin下需要做特殊处理?

备注:内容来源于stack exchange,提问作者Curious User

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:15:29