Найти тему
Stanislav Matsak

Настройка COM порта для работы через Wine

На днях столкнулся с проблемой настройки COM порта для win.32 приложения для работы без Windows (основное условие заказчика).
Приложение работает с несколькими типами устройств и все они используют стандартные настройки COM: 9600,8,n,1 и с их настройкой для работы через Wine проблем не возникло - все работало по стандартной инструкции из коробки.

1. Пользователя Wine включить в группу dialout

sudo usermod -g dialout wineuser

2. Установить последний wine, не буду дублировать есть готовая хорошая инструкция:
https://wiki.winehq.org/Ubuntu

3. Далее сконфигурировать и создать директорию wine

WINEARCH=win32 WINEPREFIX=~/.wine winecfg

4. Все настройки из коробки позволят вам работать со стандартными устройствами через COM порт.

Достаточно просто запустить приложение wine programma.exe

Но что делать, если устройство использует нестандартные настройки?

В моем случае это были 9600,8,E,1

Быстрой однозначнопонятной инструкции я не нашел.

Случайно, после экспериментов с picocom обнаружил, что мое несговорчивое устройство заработало, как надо после выхода из picocom и запуска wine с настройками COM порта, измененными picocom.

Дальше дело техники, алгоритм поиска нужных настроек:

1. По документации к устройству или через сниффер COM порта в Windows узнать нужные для работы устройства настройки COM порта

2. запустить утилиту настройки терминала picocom с нужными для работы устройства настройками COM порта

picocom -b 9600 -p e /dev/ttyS0

3. Выйти из picocom , запустить вашу программу через wine и убедиться, что устройство заработало.

4. Перезагрузиться, сделать слепок настроек COM порта:
stty -a -F /dev/ttyS0 >1

5. Исправить настройки через picocom

picocom -b 9600 -p e /dev/ttyS0

6. Снять изменение настроек COM порта:

stty -a -F /dev/ttyS0 >2

7. Сравнить результаты настроек:
diff 1 2

8. Разницу настроек задать командой настройки COM порта:

stty 9600 parenb -crtscts -ignbrk -ixon -F /dev/ttyS0
В моем случае это были: parenb -crtscts -ignbrk -ixon

9. Запустить wine, убедиться в штатной работе устройства.
10 . Перезагрузить систему, применить настройки порта, запустить wine, проверить работу устройства. Если устройство заработало - я вас поздравляю, вы справились с задачей, :)

P.S. Как показала практика, настройка -ixon нужна любому com (/dev/tty*, включая переходники USB и прочие встроенные в периферийные устройства конверторы COM портов) для работы через Wine, в противном случае общение с устройствами из win api программ заканчивается (и очень быстро) таймаутами устройства.
Т.е. перед запуском программ для работы через wine абсолютно все порты надо настроить командой:

stty -ixon -F /dev/ttyS0 (com1)
stty -ixon -F /dev/ttyUSB0 (USB переходник)

Так же, чтобы не возиться с ссылками на ком порты, лучше и проще назначать порты через реестр Wine:
HKEY_LOCAL_MACHINE\Software\Wine\Ports

Такая настройка имеет более высокий приоритет, чем ссылки на устройства.

Нужно создать строковый параметр с названием компорта (например com1) и в качестве значения - устройство, которой wine будет использовать для работы.
Пример экспорта ветки реестра (
Com1=/dev/ttuUSB0):

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\Software\Wine\Ports]

"com1"="/dev/ttyUSB0"