У меня есть лабораторное оборудование (CAEN 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
. Что я делаю неправильно?
В конечном итоге вся проблема заключалась в том, что мне не хватало символа $
в начале каждой команды, поэтому команда для отправки будет
command = '$BD:0,CMD:MON,PAR:BDFREL\r\n'.encode('ASCII')
. Я отбросил синтаксические ошибки, потому что в этом случае я был ожидая ответа от устройства, говорящего, что в команде есть ошибка, но кажется, что для этой ошибки ответ - просто тишина, и это меня смутило. (Также я не знал об отсутствии $
.)
Многие проблемы с доступом к устройству могут быть решенным путем изменения членства в группе.
В частности, если ls -l
показывает, что разрешения группы (второй триплет « rwx
]) имеют вид« rw
»(например,« -rw-rw ----
"), затем добавление себя в группу, владеющую устройством, предоставит доступ rw
.
Вот как:
device="/dev/whatever"
sudo adduser $USER $(stat -c "%G" $device)
Это позволяет вам членство в группе, которая может rw
устройство, но есть еще один шаг.
Чтобы сделать все ваши процессы членами новой группы, выйдите из системы и войдите в систему. Членство в группах устанавливается при входе в
время.
Чтобы создать единый процесс в новой группе (для тестирования, перед выходом из системы / входом в систему):
newgrp $(stat -c "%G" $device)
или просто введите имя группы. См. man newgrp
.