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

OpenWrt下C应用无法向/dev/ttyACM0连接的STM32写入数据问题咨询

故障原因分析

核心根因

dmesg中cdc_acm 1-1.3:1.0: failed to set dtr/rts报错直接指向流控配置异常:

  • 你的自研C应用打开串口时,会通过tcsetattr等系统调用配置串口参数,默认开启了DTR/RTS硬件流控,或是主动调用了TIOCMSET类IOCTL接口设置DTR/RTS电平,这一步在新固件环境下执行失败。
  • echo命令可以正常写入的原因是:直接向字符设备节点写入数据的操作不会主动修改串口的termios配置,也不会尝试设置DTR/RTS状态,相当于绕过了流控配置步骤,所以可以正常发送数据。配置失败后串口驱动会默认拦截写操作,最终表现为C应用无法写入。

可能的触发源

  • 第一种情况:STM32侧LIMA新固件的USB CDC堆栈配置被修改,关闭了DTR/RTS支持,或是修改了CDC类描述符,导致OpenWRT侧cdc_acm驱动识别到设备不支持DTR/RTS控制,设置操作直接报错。
  • 第二种情况:编译OpenWRT固件时同步更新了kmod-usb-acm驱动或内核版本,新版本驱动对DTR/RTS设置的校验逻辑更严格,旧环境下可以兼容的不规范配置在新版本下直接返回错误,属于USB相关软件包更新引发的异常。
  • 第三种情况:C应用未对串口参数设置的返回值做错误校验,DTR/RTS设置失败后没有降级处理逻辑,直接执行后续写操作,被流控逻辑阻塞。
排查方案
  • 修改C应用的串口配置逻辑,关闭硬件流控(清除termios结构中的CRTSCTS位),删除主动设置DTR/RTS电平的相关代码,重新编译测试。
  • 执行stty -F /dev/ttyACM0 -crtscts命令手动关闭设备节点的硬件流控,再启动C应用验证功能是否恢复。
  • 对比LIMA新旧固件的USB CDC配置,确认是否修改了DTR/RTS相关参数。
  • 回退到编译前的旧版OpenWRT USB ACM驱动包,验证故障是否消失,确认是否为软件包更新导致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:39:00