Не удается считать данные с последовательного USB-устройства

У меня есть лабораторное оборудование (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. Что я делаю неправильно?

0
задан 30 April 2021 в 17:46

2 ответа

В конечном итоге вся проблема заключалась в том, что мне не хватало символа $ в начале каждой команды, поэтому команда для отправки будет

command = '$BD:0,CMD:MON,PAR:BDFREL\r\n'.encode('ASCII')

. Я отбросил синтаксические ошибки, потому что в этом случае я был ожидая ответа от устройства, говорящего, что в команде есть ошибка, но кажется, что для этой ошибки ответ - просто тишина, и это меня смутило. (Также я не знал об отсутствии $ .)

0
ответ дан 7 May 2021 в 17:41

Многие проблемы с доступом к устройству могут быть решенным путем изменения членства в группе.

В частности, если 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 .

1
ответ дан 7 May 2021 в 17:41

Другие вопросы по тегам:

Похожие вопросы: