Я хочу считать единственные строки состояния (txd, dtr...) преобразователя PL2303 USB2RS232 с statserial. Я уже присоединил свой PL2303 к ttyUSB0 порту. Но считывать данные, мне нужна команда statserial, который просто принимает ttyS* (если я пытаюсь использовать его с ttyUSB*, "разрешение отклонило" apperars). Как можно изменить ttyUSB* на ttyS* "адрес"??
lsusb:
gernot@gernot-Lenovo-G505s:~$ lsusb
Bus 002 Device 002: ID 0bda:0129 Realtek Semiconductor Corp. RTS5129 Card Reader Controller
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 174f:147b Syntek
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 004: ID 0cf3:3004 Atheros Communications, Inc.
Bus 003 Device 002: ID 062a:4101 Creative Labs
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 002: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
dmesg:
...
[ 53.186869] ISO 9660 Extensions: Microsoft Joliet Level 3
[ 54.986337] ISOFS: changing to secondary root
[ 76.485704] usb 5-1: new full-speed USB device number 2 using xhci_hcd
[ 76.522777] usb 5-1: New USB device found, idVendor=067b, idProduct=2303
[ 76.522786] usb 5-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 76.522791] usb 5-1: Product: USB-Serial Controller
[ 76.522795] usb 5-1: Manufacturer: Prolific Technology Inc.
[ 76.557641] usbcore: registered new interface driver usbserial
[ 76.557658] usbcore: registered new interface driver usbserial_generic
[ 76.557668] usbserial: USB Serial support registered for generic
[ 76.559702] usbcore: registered new interface driver pl2303
[ 76.559719] usbserial: USB Serial support registered for pl2303
[ 76.560192] pl2303 5-1:1.0: pl2303 converter detected
[ 76.588044] usb 5-1: pl2303 converter now attached to ttyUSB0
...
Спасибо за справку!
Обновление: кажется, что я не был членом dialout группы. Я добавил своего пользователя к тому использованию группы sudo usermod -a -G dialout <username>
После этого у меня было разрешение получить доступ к USB-портам и Последовательным портам. Теперь терминальные программы как работа moserial. Но я все еще не могу получить доступ к использованию строк состояния statserial
. Вместо этого я получаю то сообщение:
gernot@gernot-Lenovo-G505s:~$ statserial ttyUSB0
statserial: can't open device `ttyUSB0': No such file or directory
Обновление 2: Мне удалось заставить statserial работать (смысл этого потока выйдет из строя, я предполагаю): Сначала необходимо сбросить порт и затем установить жесткую ссылку на ttyS*-port с более высоким количеством, чем количество стандартных портов:
sudo rm /dev/ttyS40
sudo ln /dev/ttyUSB0 /dev/ttyS40
Но как я могу скопировать данные, отображенные в терминале в какой-либо объект, который я могу считать с, самодельным кодом? И почему statserial-инструмент реагирует так медленно на измененные staus строки?
Ваша первая проблема (полномочия устройства) была устранена путем добавления пользователя к корректной группе.
Ваш второй выпуск (путь устройства), кажется, что Вы не используете весь путь устройства. От man statserial
:
дополнительный параметр имени устройства является полным именем файла устройств для рассматриваемого последовательного порта. Если не определенный, значение по умолчанию взято от МОДЕМА переменной среды, если установлено, иначе/dev/cua1.
, Таким образом, необходимо сделать statserial /dev/ttyUSB0
(я проверил, источник для проверки этого корректен, он буквально делает fd = open(device,...)
, где устройство является argv [x])
Для универсальной информации о программировании последовательного порта, см. ПРАКТИЧЕСКОЕ РУКОВОДСТВО Последовательного программирования . Можно посмотреть на источник statserial с apt-get source statserial
(это - очень простая программа, скомпилированная из единственного файла statserial.c
, который является 195 строками долго).
обновление является медленным, потому что statserial только опрашивает последовательный порт каждую секунду, основной цикл:
for (;;) {
/* get modem status info */
status = ioctl(fd, TIOCMGET, &arg);
if (status != 0) {
perror("statserial: TIOCMGET failed");
exit(1);
}
...
printw("Device: %s\n\n", device);
printw("Signal Pin Pin Direction Status Full\n");
printw("Name (25) (9) (computer) Name\n");
printw("----- --- --- --------- ------ -----\n");
printw("FG 1 - - - Frame Ground\n");
printw("TxD 2 3 out - Transmit Data\n");
printw("RxD 3 2 in - Receive Data\n");
printw("RTS 4 7 out %1d Request To Send\n", !!(arg & TIOCM_RTS));
printw("CTS 5 8 in %1d Clear To Send\n", !!(arg & TIOCM_CTS));
printw("DSR 6 6 in %1d Data Set Ready\n", !!(arg & TIOCM_DSR));
printw("GND 7 5 - - Signal Ground\n");
printw("DCD 8 1 in %1d Data Carrier Detect\n", !!(arg & TIOCM_CAR));
printw("DTR 20 4 out %1d Data Terminal Ready\n", !!(arg & TIOCM_DTR));
printw("RI 22 9 in %1d Ring Indicator\n", !!(arg & TIOCM_RNG));
refresh();
/* break out if -n option was used */
if (n_option)
exit(0);
/* delay 1 second between loops */
sleep(1);
}
, Если бы Вы делаете какую-либо серьезную работу с последовательными портами, я настоятельно рекомендовал бы, чтобы Вы получили реальную карту последовательного порта (плата PCI с контроллером RS232 на ней). Адаптеры USB не достаточно надежны, особенно если Вы свяжетесь со старыми аппаратными средствами, Вы найдете, что они не воспроизводят синхронизации сигнала точно, которые вызовут проблемы с некоторыми устройствами. Другая типичная проблема состоит в том, что последовательные порты USB не реализуют (или плохо реализуют), аппаратные средства квитирование РТС/CTS, и таким образом закончите тем, что были несовместимыми со старыми устройствами последовательного порта. Однако PL2303 является одними из лучших микросхем и должен работать с большинством устройств.
Я не знаю о statserial
(и я знаю, что это - старый вопрос), но если Вы хотите иметь название отдельного устройства, можно отбросить файл в /etc/udev/rules.d/
как этот (мой называют 98-devicename.rules
):
SUBSYSTEM=="tty" ATTRS{idVendor}=="067b" ATTRS{idProduct}=="2303" SYMLINK+="devicename%n" MODE:="0666"
Это будет соответствовать идентификатору/поставщику USB и позволять всем пользователям доступу, не будучи в dialout
группа (MODE
). Это также создаст символьную ссылку /dev/devicename0
-> /dev/ttyUSB0
принятие его является первым из обоих. Если бы у Вас было другое устройство с другим чипсетом USB (например, Сайпрес один) уже включенный, то это могло бы быть первым из этого чипсета, таким образом, /dev/devicename0
-> /dev/ttyUSB1
. При наличии udev
обработайте символьные ссылки, Вы не должны волноваться об этом включаемый в другой порт и т.д. - devicename0
должно всегда быть первое устройство, которое использует тот чипсет.
Для нахождения большего количества вещей, которым можно соответствовать посмотрите udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
.
Что касается того, как подключить пользовательский код к последовательным портам, так как я обычно использую Python, я рекомендовал бы проверить pySerial библиотеку https://wiki.python.org/moin/PySerial