与 TDK-Lambda ZUP 的串行 RS485 / RS232 通信仅在 Linux 中非常慢

Serial RS485 / RS232 communication with TDK-Lambda ZUP very slow only in Linux

在我们的实验中,我们使用许多 ZUP 电源为电子设备供电。 具体型号为 TDK-Lambda ZUP80-2.5 和 ZUP6-33。它们由服务器远程控制和监控 运行 Linux.

问题是串口通讯很慢。我所说的慢是指 ZUP 波特率可以设置在 300 到 9600 之间。为了(几乎)可靠地与 PSU 通信,我必须将波特率设置为最小 300 bps。

起初,我怀疑是硬件或线路问题,但情况似乎没有任何改善。然后我用 official proprietary Windows application 测试了 PSU(使用完全相同的硬件设置),我可以毫无问题地以 9600 波特率进行通信。所以问题无疑出在Linux驱动程序或我的代码中。

ZUP 可以通过RS232 或RS485 与PC 通信。我尝试了它们,结果相同。我试过用便宜的RS485-USB适配器、台式机的RS232串口和专业级的PCIe RS485卡,都没有成功。

作为一种编程语言,我使用的是Python。我尝试使用 pyvisapy and a scientific software called Pyrame,它本质上提供了一个围绕 serial Python 模块的包装器。我应该尝试使用其他语言吗?

这是一个展示我如何在 pyvisapy 中访问该单元的最小示例:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import visa
from visa import constants
rm = visa.ResourceManager('@py')
inst = rm.open_resource('ASRL/dev/ttyUSB0::INSTR')
inst.baud_rate = 9600 # 300
inst.write_termination = ''
inst.read_termination = '\r\n'
inst.set_visa_attribute(constants.VI_ATTR_ASRL_FLOW_CNTRL, constants.VI_ASRL_FLOW_XON_XOFF)
inst.stop_bits = constants.StopBits.one
inst.parity = constants.Parity.none
inst.data_bits = 8

print(inst.write(":ADR01;"))
print(inst.write(":REV?;"))
print(inst.read())

在Linux中,上面的代码适用于 300 bps 但不适用于 9600 bps(随着波特率的增加情况逐渐变得更糟)。即使是 300 bps,在发送或接收长命令时有时也会出现超时或数据损坏错误。

PS 我们的 DAQ 仅在 Linux 中运行,因此使用 Windows 不是一个选项。

结果是 Python 本身的问题,正如用户 Marcos G 所指出的那样。正如我在评论中所写的那样,我尝试使用 [=10= 编写驱动程序] 和 arduino-serial。尽管最初取得了部分成功,但事实证明他们都或多或少地遇到了相同的问题。 所以我使用 libserialport C library 在 C++ 中完全重写了驱动程序。现在我几乎可以全速与 ZUP 通信了。