【发布时间】:2023-03-26 03:24:01
【问题描述】:
在我们的实验中,我们使用许多 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 和一个名为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。
【问题讨论】:
-
感谢您的建议。我刚刚尝试使用 minicom,我可以以最高波特率进行通信。正如你所说,我认为罪魁祸首是pyserial。我已经尝试过这个没有使用pyserial的python库arduino-serial,它也可以。
标签: python linux serial-port rs485