Вопрос или проблема
Я использую Ubuntu 14.04, и когда выполняю ls для /dev/ttyS*
, вижу, что система автоматически создает 32 порта при загрузке. Однако, когда я запускаю программы в Wine (инструкции по установке scantool.net в Wine), они не видят никаких COM портов.
ИЗМЕНЕНИЕ
Согласно документации Wine, мне просто нужно создать символическую ссылку на USB-устройство.
lsusb
Bus 003 Device 002: ID 0403:6001 Future Technology Devices
International, Ltd FT232 USB-Serial (UART) IC
lsmod | grep ftdi
ftdi_sio 52885 0
usbserial 45141 1 ftdi_sio
ls -al /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 окт 16 07:21 /dev/ttyUSB0
ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com1
ls -al ~/.wine/dosdevices/com1
lrwxrwxrwx 1 sailorbob sailorbob 12 окт 16 08:24 com1 -> /dev/ttyUSB0
sudo adduser sailorbob dialout
[sudo] password for sailorbob:
Adding user `sailorbob' to group `dialout' ...
Adding user sailorbob to group dialout
Done.
ОК, но всё равно не отображается в scantool под Wine.
ИЗМЕНЕНИЕ 2
Итак, я попробовал выполнить эту команду:
stty -F /dev/ttyUSB0 -a
stty: /dev/ttyUSB0: Device or resource busy
Я не уверен, как это может быть занято, так как другой конец не подключен ни к чему.
ИЗМЕНЕНИЕ 3
Отключил и снова подключил scantool, и теперь я вижу следующее:
~/.wine/dosdevices$ stty -F com1 -a
speed 115200 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S;
susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 100; time = 2;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon iexten -echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
Тем не менее, программа scantool в Wine всё ещё не видит COM порт.
В качестве диагностического шага, есть ли способ проверить, доступен ли порт через Wine?
Мне пришлось скопировать следующие реестры из Windows, чтобы моя программа начала обнаруживать COM порт. Возможно, это поможет кому-то.
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}\##?#USB#VID_067B&PID_2303#5&18f54cb7&0&2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}]
"DeviceInstance"="USB\\VID_067B&PID_2303\\5&18f54cb7&0&2"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}\##?#USB#VID_067B&PID_2303#5&18f54cb7&0&2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}\#]
"SymbolicLink"="\\\\?\\USB#VID_067B&PID_2303#5&18f54cb7&0&2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}\##?#USB#VID_067B&PID_2303#5&18f54cb7&0&2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}\#\Control]
"Linked"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}\##?#USB#VID_067B&PID_2303#5&18f54cb7&0&2#{86e0d1e0-8089-11d0-9ce4-08003e301f73}\Control]
"ReferenceCount"=dword:00000000
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_067B&PID_2303]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_067B&PID_2303\5&18f54cb7&0&2]
"DeviceDesc"="@oem4.inf,%devicedesc%;Prolific USB-to-Serial Comm Port"
"LocationInformation"="Port_#0002.Hub_#0001"
"Capabilities"=dword:00000084
"HardwareID"=hex(7):55,00,53,00,42,00,5c,00,56,00,49,00,44,00,5f,00,30,00,36,\
00,37,00,42,00,26,00,50,00,49,00,44,00,5f,00,32,00,33,00,30,00,33,00,26,00,\
52,00,45,00,56,00,5f,00,30,00,33,00,30,00,30,00,00,00,55,00,53,00,42,00,5c,\
00,56,00,49,00,44,00,5f,00,30,00,36,00,37,00,42,00,26,00,50,00,49,00,44,00,\
5f,00,32,00,33,00,30,00,33,00,00,00,00,00
"CompatibleIDs"=hex(7):55,00,53,00,42,00,5c,00,43,00,6c,00,61,00,73,00,73,00,\
5f,00,46,00,46,00,26,00,53,00,75,00,62,00,43,00,6c,00,61,00,73,00,73,00,5f,\
00,30,00,30,00,26,00,50,00,72,00,6f,00,74,00,5f,00,30,00,30,00,00,00,55,00,\
53,00,42,00,5c,00,43,00,6c,00,61,00,73,00,73,00,5f,00,46,00,46,00,26,00,53,\
00,75,00,62,00,43,00,6c,00,61,00,73,00,73,00,5f,00,30,00,30,00,00,00,55,00,\
53,00,42,00,5c,00,43,00,6c,00,61,00,73,00,73,00,5f,00,46,00,46,00,00,00,00,\
00
"ContainerID"="{9d6477a1-d549-11ee-bf0e-08002781e570}"
"ConfigFlags"=dword:00000000
"ClassGUID"="{4d36e978-e325-11ce-bfc1-08002be10318}"
"Driver"="{4d36e978-e325-11ce-bfc1-08002be10318}\\0000"
"Class"="Ports"
"Mfg"="@oem4.inf,%pro%;Prolific"
"Service"="Ser2pl"
"FriendlyName"="Prolific USB-to-Serial Comm Port (COM3)"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_067B&PID_2303\5&18f54cb7&0&2\Device Parameters]
"PortName"="COM3"
"PollingPeriod"=dword:00000000
"SymbolicName"="\\??\\USB#VID_067B&PID_2303#5&18f54cb7&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_067B&PID_2303\5&18f54cb7&0&2\LogConf]
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_067B&PID_2303\5&18f54cb7&0&2\Control]
"ActiveService"="Ser2pl"
Скорее всего, не все нужно.
Ответ или решение
Конечно, проблема, заключающаяся в том, что программы под Wine не видят COM-порты на Ubuntu 14.04, может вынудить вас задуматься над несколькими аспектами конфигурации системы и настроек самого Wine. Рассмотрим подробно, как можно подойти к решению данной задачи, используя теоретические знания, практические примеры и применение решений.
Теоретическая основа
Wine, сокращение от "Wine Is Not an Emulator" (Wine не является эмулятором), позволяет запускать программы, предназначенные для Windows, на операционных системах семейства Unix, таких как Linux. Одной из ключевых задач, связанных с использованием Wine, является настройка взаимодействия с устройствами, такими как последовательные порты или USB-устройства. В случае Ubuntu, где устройства обычно представлены в файловой системе /dev
(например, /dev/ttyS0
для последовательных портов и /dev/ttyUSB0
для USB-портов), Wine требует настройки файлов символических ссылок для доступа к этим устройствам.
Пример практического решения
В рассматриваемом случае у вас возникли трудности с определением COM-портов программами под Wine. Вы правильно установили, что сначала необходимо создать символическую ссылку из директории Wine на существующее устройство в файловой системе Linux. Пользователь попробовал команду:
ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com1
Эта команда должна создать логическую ссылку между устройством в Linux и устройством в Wine. Однако, несмотря на выполненную операцию, устройства не были определены в программе, работающей под Wine.
Следующий шаг потребовал добавить пользователя в группу dialout
, чтобы дать разрешения на доступ к последовательным устройствам:
sudo adduser sailorbob dialout
Этот шаг важен для обеспечения необходимых прав доступа, так как без соответствующих разрешений операционная система может блокировать попытки доступа к устройствам.
Попытка проверки состояние устройства с помощью команды stty
было затруднено из-за сообщения, что устройство занято:
stty -F /dev/ttyUSB0 -a
Сообщение о занятости устройства обычно указывает на то, что к устройству уже есть какие-то соединения, либо оно неправильно инициализировано. Решение могло бы заключаться в извлечении и повторном подключении устройства, как это было сделано. После этого, проверка состояния была успешной, но проблема с недостаточным распознаванием устройства осталась.
Применение подхода и дальнейшие шаги
- Регистрация в Wine: В случае, если символических ссылок недостаточно, может потребоваться редактирование реестра Wine. Это зачастую связано с воспроизведением ключевых данных реестра из Windows в Wine. В вашем случае, это возможно достижение некоторые устройства, копируя информацию реестра, связанную с конкретными USB-устройствами, как было продемонстрировано во втором фрагменте кода:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{86e0d1e0-8089-11d0-9ce4-08003e301f73}]
...
- Проверка занятости порта: Убедитесь, что никакие другие процессы не блокируют доступ к порту. Это можно проверить, используя команды:
lsof | grep /dev/ttyUSB0
-
Проверка конфигурации Wine: Дополнительно установите, что все конфигурационные файлы и компоненты Wine обновлены и правильно настроены. Иногда проблемные модули могут быть результатом несовместимости или багов, которые были исправлены в более новых версиях.
-
Обновление системы: Рассмотрите возможность обновления Ubuntu или непосредственно Wine до более новой версии. Обратите внимание, что поддержка Ubuntu 14.04 официально прекращена, и это может вызывать проблемы с функциональностью текущих версий программного обеспечения.
В заключение, совместимость и взаимодействие между посистемами Unix и Windows, особенно в контексте специфического оборудования, остаются сложной задачей. В вашем случае применение комбинации корректного прав доступа, символических ссылок, и, возможно, корректировок реестра Wine может привести к решению проблемы. Если же все предложенные шаги не привели к результату, возможно, стоит обратиться к соответствующим сообществам или рассмотреть изменение архитектуры системы на более актуальное оборудование и ПО, совместимые из коробки.