我最近从 10.04 升级到 ubuntu 12.04。在 10.04 下,我使用 usbserial 驱动程序通过串行端口连接到设备没有遇到任何问题。升级后通常我无法重置波特率:它已初始化为 9600,但我的设备需要 115200。当我尝试重置速度时,我得到:
$ sudo stty -F /dev/ttyUSB0
speed 9600 baud; line = 0;
-brkint -imaxbel
$ sudo stty -F /dev/ttyUSB0 115200
stty: /dev/ttyUSB0: unable to perform all requested operations
$ sudo setserial -av /dev/ttyUSB0
Cannot get serial info: Invalid argument
$ ls -l /dev/ttyUS*
crw-rw---- 1 root dialout 188, 0 Nov 26 10:21 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Nov 26 10:21 /dev/ttyUSB1
最奇怪的是我有时也能做到这一点。我第一次重新启动系统,它成功了。关机后出现同样的问题,重新启动不起作用,但重新加载驱动程序可以。不幸的是,从那时起,这并没有奏效:
$ sudo modprobe -r usbserial
$ sudo modprobe usbserial vendor=0x0403 product=0x6001
$ sudo stty -F /dev/ttyUSB0 115200
stty: /dev/ttyUSB0: unable to perform all requested operations
答案1
我想我找到了解决方案,以防将来有人用谷歌搜索它。我的 10.04 默认情况下没有加载 usbserial,所以我必须使用 来加载 usbserial modprobe usbserial vendor=0x0403 product=0x6001
,我将其添加到/etc/modules
.我升级后,我的12.04ftdi_sio
默认加载驱动程序,这是针对我正在使用的嵌入式设备的。我没有改变我的/etc/modules
背部,所以usbserial
也被加载了,并且可能引起某种冲突。我删除usbserial
并/etc/modules
重新启动,它起作用了。
如果我对这个解决方案真的有信心,我会通过再次重新启动我的机器并查看串行端口是否正常启动来确认它 - 但如果我重新启动并失去连接,我会觉得很愚蠢,因为我确实需要在同时完成工作我有。
答案2
USB 转串行设备(例如 Prolific 或 FTDI 系列)不遵循任何官方规范。相反,它们使用两个批量端点(一个用于输出,一个用于输入)以及特定于供应商的控制消息,用于配置波特率等内容。因此,如果像通用usbserial
驱动程序这样的东西在 FTDI 芯片上设置波特率或执行其他配置任务时遇到困难,也就不足为奇了。正如您所注意到的,使用效果ftdi_sio
会更好。
即使是 10.04 也应该默认加载ftdi_sio
,因为ftdi_sio
几乎从 Ubuntu 存在以来就已经被硬编码来处理 4003:6001 (FT232) 设备。我的猜测是,您正在加载两个注册为处理 4003:6001 的驱动程序 - 一个是设计使然,另一个是由于您的模块参数所致。更改内核甚至月相可能意味着一个恰好在另一个之前加载 - 如果usbserial
先加载,您将无法设置波特率。您应该删除手动usbserial
配置,并让其ftdi_sio
处理该设备。它适用于 10.04 和 12.04。