两个串行端口(RS232 和 RS422)互相冲突。/dev/ttyUSB 崩溃

两个串行端口(RS232 和 RS422)互相冲突。/dev/ttyUSB 崩溃

问题:当连接到串行端口的串行设备已打开电源时,我的 Ubuntu 操作系统无法处理两个串行端口。如何克服此问题并防止端口崩溃?我该如何排除故障?

症状概述:当两个串行到 USB 转换器连接到 PC 时(没有连接任何串行设备),一切正常;它们显示为 ttyUSB0 和 ttyUSB1。但是,当我将串行设备连接到它们并打开串行设备的电源时,其中一个串行端口崩溃了(它从 /dev 目录中消失)。这不是硬件问题或接线问题。操作系统中发生了一些事情,让我头上长了白发......你能帮忙吗?请继续阅读以了解详情。

我在联想笔记本电脑上运行 Ubuntu 14.04.3。

我目前能够使用最少的硬件和软件重现错误。以下步骤可重现问题:

  1. 我启动了电脑。

  2. 一旦 PC 启动,我就会运行dmesg并将输出保存到文件中。参见https://pastebin.com/4fXxK1hV

  3. 我插入了一个名为“Labjack U3”的 2.0 USB 设备。我认为这与此事没有太大关系,但必须注意。

  4. 我将 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`
    
  5. dmesg再次运行。输出如下: https://pastebin.com/uTGra1h7

  6. 我进入/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
    
  7. /dev我打开连接到 RS422 端口的设备。或ls -l | grep USB和 的输出没有变化lsusb

  8. 我连接了 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
    
  9. 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
    
  10. 到目前为止一切正常。我运行dmesg命令来捕获所有内容以进行故障排除。参见:https://pastebin.com/3kZNLtr6

  11. 问题就出现在此时。我将一个串行设备连接到 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`
    

    您可以看到我丢失了一个串行端口!

  12. 现在我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

最终解决这个问题的方法是断开接地连接。肯定存在接地环路。

相关内容