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

串口设备节点数据传输二次运行失效问题排查求助

串口二次运行打开阻塞问题排查方案

可能的核心原因

  • 串口硬件引脚(如DTR/RTS)未正确释放,导致设备处于占用/休眠状态
  • 系统生成的串口锁定文件未自动清除
  • 代码中打开参数未设置非阻塞,导致等待硬件信号超时
  • 文件描述符关闭不彻底或终端属性未恢复

分步排查与解决

1. 检查系统锁定文件

运行以下命令查看是否存在串口锁定文件:

ls /var/lock/LCK*

如果存在对应/dev/ttyUSB0或/dev/ttyUSB2的锁定文件(如LCK..ttyUSB0),手动删除后重新运行程序:

sudo rm /var/lock/LCK..ttyUSB0

2. 代码层面修改

(1)打开串口时添加非阻塞标志

原打开调用可能因等待硬件DCD信号阻塞,修改为:

int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NONBLOCK);

若需要后续阻塞读写,打开后可恢复阻塞模式:

fcntl(fd, F_SETFL, 0); // 清除O_NONBLOCK标志

(2)确保终端属性恢复

打开串口前保存原终端属性,退出(包括异常退出)时强制恢复:

struct termios original_attr;

// 打开串口后保存原属性
tcgetattr(fd, &original_attr);

// 程序退出前恢复
tcsetattr(fd, TCSANOW, &original_attr);

(3)释放DTR引脚防止设备锁定

关闭串口前主动清除DTR信号,释放硬件:

int status;
ioctl(fd, TIOCMGET, &status);
status &= ~TIOCM_DTR; // 关闭DTR
ioctl(fd, TIOCMSET, &status);

(4)检查close返回值,确保文件描述符正确关闭

不要忽略close的错误信息,排查是否真的关闭成功:

if (close(fd) == -1) {
    perror("close serial port failed");
}

3. 硬件与系统验证

  • 使用minicom或screen工具手动打开串口,验证是否能正常访问:
    minicom -D /dev/ttyUSB0 -b 9600
    
    若工具能正常打开,说明问题出在代码逻辑;若工具也无法打开,排查USB转串口驱动或硬件本身。
  • 更换USB接口或适配器,排除硬件故障。

内容的提问来源于stack exchange,提问作者femi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:35:13