Linux上的串行设备在数据传输几分钟后挂起

时间:2013-09-02 15:24:48

标签: serial-port linux-device-driver embedded-linux usbserial openwrt

我正在使用 openwrt (在路由器上运行的嵌入式Linux)。我正在使用显示为/dev/ttyACM0的USB转串口转换器。

[ 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()系统调用串口上的读/写事件{ {1}}。
每当发生读取事件时,消息都会转储到fd 我没有在串口上启用硬件流控制。

我使连接的外围设备每2秒在串行链路上发送一些预定义的消息 现在,当我在 openwrt 中运行我的代码来打印串行消息时,我能够看到来自外围设备的消息。
问题是几分钟后串行链路就会死机。串行接口上​​没有更多读取事件 重置外围设备也无济于事。使其再次工作的唯一方法是从USB完全移除外围设备并重新启动 相同的设置在我的Ubuntu盒子上工作得很好。我使用相同的驱动程序接口,即usb-acm(在stdout中)。在这里,系统可以在没有串行挂起的情况下永远运行。

关于发生了什么的任何想法或建议?

2 个答案:

答案 0 :(得分:0)

我会尝试:在速度较慢的9600上使用串口,​​你可能想尝试使用某些终端模拟器来重现问题 - 你可以尝试:

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

我还有一个提示:尝试使用inittab

将某些程序绑定到串行控制台

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

连接断开时......

  • dmesg中有消息吗?
  • 如果你的usb插头有rx / tx的LED,它们应该每2秒闪烁一次......挂起后它会闪烁或不闪烁?

possibliy no-op提示:接地是否正确连接?用万用表检查

答案 1 :(得分:0)

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

关闭wifi界面应该解决这个问题,保留wifi的解决办法是 使用USB 2.0集线器有效地将连接速度转换为AR9331 USB2.0高速(480Mbps);你可能遇到的唯一问题是一些USB 2.0 集线器是劣等的,所以你可能需要尝试一两个。