我有实验室设备(卡昂 DT1470ET) 通过 USB 连接到 Ubuntu 20.04 机器。我已经安装了制造商提供的图形界面软件,它可以正确与仪器连接。但是,当我尝试使用 Python 执行此操作时,却无法完成。
这是我的代码:
import serial
import time
CAEN = serial.Serial(
port = '/dev/ttyACM0',
baudrate = 9600,
parity = serial.PARITY_NONE,
stopbits = 1,
bytesize = 8,
xonxoff = True,
timeout = 1,
)
command = 'BD:0,CMD:MON,PAR:BDFREL\r\n'.encode('ASCII')
print(f'Sending: {command}')
CAEN.write(command)
time.sleep(1)
print(f'Reading...')
print(CAEN.read(111))
问题出在行上CAEN.read
。它总是超时,所以它总是打印b''
(即空答案),如果timeout=1
删除该行,它会无限期地停留在那里。
如果我跑步udevadm info -r -q all /dev/ttyACM0
我会得到:
$ udevadm info -r -q all /dev/ttyACM0
P: /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/tty/ttyACM0
N: ttyACM0
L: 0
S: serial/by-path/pci-0000:00:14.0-usb-0:1:1.0
S: serial/by-id/usb-CAEN_SPA_NIM_Desktop_HV_Power_Supply-if00
E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/tty/ttyACM0
E: DEVNAME=/dev/ttyACM0
E: MAJOR=166
E: MINOR=0
E: SUBSYSTEM=tty
E: USEC_INITIALIZED=17958516201
E: ID_BUS=usb
E: ID_VENDOR_ID=21e1
E: ID_MODEL_ID=0003
E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller
E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller
E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI
E: ID_VENDOR_FROM_DATABASE=Intel Corporation
E: ID_VENDOR=CAEN_SPA
E: ID_VENDOR_ENC=CAEN\x20SPA
E: ID_MODEL=NIM_Desktop_HV_Power_Supply
E: ID_MODEL_ENC=NIM\x2fDesktop\x20HV\x20Power\x20Supply
E: ID_REVISION=0100
E: ID_SERIAL=CAEN_SPA_NIM_Desktop_HV_Power_Supply
E: ID_TYPE=generic
E: ID_USB_INTERFACES=:020201:0a0000:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=cdc_acm
E: ID_USB_CLASS_FROM_DATABASE=Communications
E: ID_PATH=pci-0000:00:14.0-usb-0:1:1.0
E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_1_1_0
E: ID_MM_CANDIDATE=1
E: DEVLINKS=/dev/serial/by-path/pci-0000:00:14.0-usb-0:1:1.0 /dev/serial/by-id/usb-CAEN_SPA_NIM_Desktop_HV_Power_Supply-if00
E: TAGS=:systemd:
我已经用 设置了串行端口的权限sudo chmod 666 /dev/ttyACM0
。我做错了什么?
答案1
许多设备访问问题可以通过组成员身份变更来解决。
具体来说,如果ls -l
显示组权限(第二个“ rwx
”三元组)为“ rw
”(例如“ -rw-rw----
”),那么将自己添加到拥有该设备的组将授予rw
访问权限。
就是这样:
device="/dev/whatever"
sudo adduser $USER $(stat -c "%G" $device)
这允许您成为可以使用该设备的组的成员rw
,但还有一个步骤。
要使所有进程成为新组的成员,请注销并登录。组成员资格是按时设置的login
。
要在新组中创建单个进程(用于测试,在注销/登录之前):
newgrp $(stat -c "%G" $device)
或者,只需键入组名。请参阅man newgrp
。
答案2
最后,问题在于我$
在每个命令的开头都缺少一个字符,所以要发送的命令是
command = '$BD:0,CMD:MON,PAR:BDFREL\r\n'.encode('ASCII')
我丢弃了语法错误,因为在这种情况下,我期望设备能够给出一些答案,说命令中有错误,但似乎对于这个错误,答案只是沉默,这让我很困惑。(而且我不知道缺少了$
。)