0

我正在使用openwrt(在路由器上运行的嵌入式 linux)。我正在使用显示为/dev/ttyACM0.

[ 2430.460000] usb 1-1: new full-speed USB device number 4 using ehci-platform
[ 2430.630000] cdc_acm 1-1:1.0: This device cannot do calls on its own. It is not a modem.
[ 2430.630000] cdc_acm 1-1:1.0: ttyACM0: USB ACM device

我为openwrt编写了一个小代码,它打开给定的串行端口,/dev/ttyACMO等待select()系统调用以获取串行端口上的读/写事件fd
每当发生读取事件时,消息都会转储到stdout.
我没有在串口上启用硬件流控制。

我让连接的外围设备每 2 秒在串行链路上发送一些预定义的消息。
现在,当我在openwrt中运行代码以打印串行消息时,我能够看到来自外围设备的消息。
问题是几分钟后串行链接掉线了。串行接口上​​不再有读取事件。
重置外围设备也无济于事。让它再次工作的唯一方法是从 USB 中完全移除外围设备并重新开始。
相同的设置在我的 Ubuntu 机器上运行良好。我使用相同的驱动程序接口,即usb-acm (in /dev/ttyACM0)。在这里,系统将永远运行而不会出现串行挂断。

对正在发生的事情有任何想法或建议吗?

4

2 回答 2

1

如果您使用的是基于 AR9331 的路由器(非常常见),那么通过 USB 连接的 CDC ACM 设备存在一个众所周知的问题。该场景是 USB 以“全速”12Mbps 连接并且 Wifi 被配置为客户端并且不与 AP 关联。USB挂起。这显然是 AR9331 中的硬件错误,没有软件解决方法。

关闭wifi接口应该可以解决这个问题,保留wifi的解决方法是使用USB 2.0集线器将AR9331的连接速度有效转换为USB2.0 High Speed(480Mbps);您可能遇到的唯一问题是某些 USB 2.0 集线器质量较差,因此您可能需要尝试一两个。

于 2014-08-30T01:02:15.310 回答
0

我会尝试:以较慢的速度使用串行 9600,您可能想尝试在 wrt 端使用一些终端仿真器来重现问题 - 您 ssh 进入它并尝试:

(while :;do echo .;sleep 1m;done) >> /dev/serialdevicename

我还有一个提示:尝试使用将一些程序绑定到串行控制台inittab

您可能想考虑其他解决原始问题的方法,并寻找根本不使用串行的替代方法(如果可能的话)

当连接断开时...

  • dmesg 中有消息吗?
  • 如果您的 USB 插头有用于 rx/tx 的 LED,它们应该每 2 秒闪烁一次……挂起后它是否闪烁?

可能无操作提示:接地是否正确连接?用万用表检查

于 2013-09-03T07:16:12.347 回答