问题:当连接到串行端口的串行设备已打开电源时,我的 Ubuntu 操作系统无法处理两个串行端口。如何克服此问题并防止端口崩溃?我该如何排除故障?
症状概述:当两个串行到 USB 转换器连接到 PC 时(没有连接任何串行设备),一切正常;它们显示为 ttyUSB0 和 ttyUSB1。但是,当我将串行设备连接到它们并打开串行设备的电源时,其中一个串行端口崩溃了(它从 /dev 目录中消失)。这不是硬件问题或接线问题。操作系统中发生了一些事情,让我头上长了白发......你能帮忙吗?请继续阅读以了解详情。
我在联想笔记本电脑上运行 Ubuntu 14.04.3。
我目前能够使用最少的硬件和软件重现错误。以下步骤可重现问题:
我启动了电脑。
一旦 PC 启动,我就会运行
dmesg
并将输出保存到文件中。参见https://pastebin.com/4fXxK1hV我插入了一个名为“Labjack U3”的 2.0 USB 设备。我认为这与此事没有太大关系,但必须注意。
我将 RS422 插入 USB 设备,但没有连接任何设备。我运行
lsusb
。它是Bus 003 Device 003: ID 0856:ac11 B&B Electronics
设备。输出为:Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 004: ID 04f2:b44d Chicony Electronics Co., Ltd Bus 001 Device 003: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad] Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 003: ID 0856:ac11 B&B Electronics Bus 003 Device 002: ID 0cd5:0003 LabJack Corporation U3 Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub`
我
dmesg
再次运行。输出如下: https://pastebin.com/uTGra1h7我进入
/dev
并运行ls -l | grep USB
。串行端口显示:constructor@constructor-pc:~$ cd /dev constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0
/dev
我打开连接到 RS422 端口的设备。或ls -l | grep USB
和 的输出没有变化lsusb
我连接了 RS232 转 USB 转换器。串行设备尚未连接到转换器。我运行了
lsusb
。它是Bus 001 Device 018: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
设备。输出为:constructor@constructor-pc:/dev$ lsusb Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 004: ID 04f2:b44d Chicony Electronics Co., Ltd Bus 001 Device 003: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad] Bus 001 Device 018: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 003: ID 0856:ac11 B&B Electronics Bus 003 Device 002: ID 0cd5:0003 LabJack Corporation U3 Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
ls -l | grep USB
接下来我在目录中运行该命令/dev
。以下是输出:constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 crw-rw---- 1 root dialout 188, 1 Nov 21 18:47 ttyUSB1
到目前为止一切正常。我运行
dmesg
命令来捕获所有内容以进行故障排除。参见:https://pastebin.com/3kZNLtr6问题就出现在此时。我将一个串行设备连接到 RS232 到 USB 转换器。到目前为止一切正常。我打开串行设备的电源(通常这是控制我的原型的软件崩溃的地方)。我立即
ls -l | grep USB
多次运行该命令。以下是输出:constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0 constructor@constructor-pc:/dev$ ls -l | grep USB crw-rw-rw- 1 root dialout 188, 0 Nov 21 16:36 ttyUSB0`
您可以看到我丢失了一个串行端口!
现在我
dmesg
寻求更有知识的人来诊断。请看:https://pastebin.com/sCYXeKa9
经过过去 5 天的测试,我得出了以下结论:
- 连接到 RS232 和 RS422 的串行设备在每次只插入一个设备时,其工作方式与制造商在手册中描述的完全一致。串行设备没有任何故障或损坏。如果每次只插入一个设备,我可以与它通信并控制它,并且它运行正常。
- 所有设备的接线良好(使用图纸和仪表进行双重和三重检查)
- 我已经移除了正在使用的 USB 集线器,并且花了很长时间才弄清楚这不是集线器的故障。
- 我已经排除了用于读取串行数据的各种软件包(我觉得这篇文章中概述的步骤证明了这一点)。
- 有趣的是,这个问题发生时我甚至还没有向串行设备发送或接收命令!当我启动连接到 RS232 到 USB 转换器的设备时,串行设备还没有发送消息(或者至少我不相信它会发送消息),但操作系统会立即丢弃串行端口。
附加信息:自从问了这个问题以来,上周我已经购买了更多的串行到 USB 端口,以防其中一个端口出现故障,但行为并没有改变。我还用备用设备替换了导致端口在打开时崩溃的串行组件,但行为并没有改变。我也尝试了另一台 PC,但行为并没有改变。
您能否提供解决方案来解决这个问题?或者如何解决此问题?
另外,如果我可以提供任何信息或运行任何命令,请随时告诉我!
答案1
这是电气问题,而不是操作系统问题。我按照制造商的文档将设备的串行端口连接到 USB 到 RS485 转换器的串行端,方式如下:
Tx- to Rx-
Tx+ to Rx+
Rx- to Tx-
Rx+ to Tx+
gnd to gnd
最终解决这个问题的方法是断开接地连接。肯定存在接地环路。