Bug 124

Summary: Не работает обмен по COM-порту (сканер штрих-кода)
Product: WINE@Etersoft Reporter: Vitaly Lipatov <lav>
Component: ОбщееAssignee: Константин Кондратюк <kondratyuk>
Status: CLOSED WONTFIX QA Contact: Vitaly Lipatov <lav>
Severity: critical    
Priority: P1 CC: triada123
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 601    
Bug Blocks: 130, 488    
Attachments: отредактированные исходники программы для проверки сканеров ChipherLab
Загрузка процессора с поиском сканера

Description Vitaly Lipatov 2006-05-09 19:18:27 MSD
Программа АТОЛ для кассовых аппаратов не видит COM-порта. 
Программа здесь: 
/var/ftp/pvt/WINE\ tests/Учётные/KKM_5_18_0 
(скачена с http://download.atol.ru/soft/drv/kkm/kkm_5_18_0/KKM_5_18_0.zip) 
Выдаваемое соообщение: 
fixme:comm:SetupComm insize 16384 outsize 16384 unimplemented stub
Comment 1 Константин Петров 2006-05-15 15:41:38 MSD
Появился патч, тестируем
[NtDll/Kernel32]: SetupComm & SET_QUEUE_SIZE

- stubbed out ntdll's serial IOCTL SET_QUEUE_SIZE
- implemented kernel32!SetupComm on top of it
 
A+
---
 
 dlls/kernel/comm.c  |   25 +++++++++++++------------
 dlls/ntdll/serial.c |   12 ++++++++++++
 2 files changed, 25 insertions(+), 12 deletions(-)
 
diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c
index f12043d..8f5c18d 100644
--- a/dlls/kernel/comm.c
+++ b/dlls/kernel/comm.c
@@ -883,6 +883,11 @@ BOOL WINAPI ClearCommError(HANDLE handle
  *  Called after CreateFile to hint to the communication resource to 
use
  *  specified sizes for input and output buffers rather than the 
default values.
  *
+ * PARAMS
+ *      handle  [in]    The just created communication resource handle
+ *      insize  [in]    The suggested size of the communication 
resources input buffer in bytes
+ *      outsize [in]    The suggested size of the communication 
resources output buffer in bytes
+ *
  * RETURNS
  *
  *  True if successful, false if the communications resource handle is 
bad.
@@ -891,18 +896,14 @@ BOOL WINAPI ClearCommError(HANDLE handle
  *
  *  Stub.
  */
-BOOL WINAPI SetupComm(
-    HANDLE handle,  /* [in] The just created communication resource 
handle. */
-    DWORD  insize,  /* [in] The suggested size of the communication 
resources input buffer in bytes. */
-    DWORD  outsize) /* [in] The suggested size of the communication 
resources output buffer in bytes. */
-{
-    int fd;
-
-    FIXME("insize %ld outsize %ld unimplemented stub\n", insize, 
outsize);
-    fd=get_comm_fd( handle, FILE_READ_DATA );
-    if(0>fd) return FALSE;
-    release_comm_fd( handle, fd );
-    return TRUE;
+BOOL WINAPI SetupComm(HANDLE handle, DWORD insize, DWORD outsize)
+{
+    SERIAL_QUEUE_SIZE   sqs;
+
+    sqs.InSize = insize;
+    sqs.OutSize = outsize;
+    return DeviceIoControl(handle, IOCTL_SERIAL_SET_QUEUE_SIZE,
+                           &sqs, sizeof(sqs), NULL, 0, NULL, NULL);
 }
 
 /
*****************************************************************************
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index 1b45a10..15d1941 100644
--- a/dlls/ntdll/serial.c
+++ b/dlls/ntdll/serial.c
@@ -729,6 +729,12 @@ static NTSTATUS set_line_control(int fd,
     return STATUS_SUCCESS;
 }
 
+static NTSTATUS set_queue_size(int fd, const SERIAL_QUEUE_SIZE* sqs)
+{
+    FIXME("insize %ld outsize %ld unimplemented stub\n", sqs->InSize, 
sqs->OutSize);
+    return STATUS_SUCCESS;
+}
+
 static NTSTATUS set_special_chars(int fd, const SERIAL_CHARS* sc)
 {
     struct termios port;
@@ -985,6 +991,12 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
         else
             status = STATUS_INVALID_PARAMETER;
         break;
+    case IOCTL_SERIAL_SET_QUEUE_SIZE:
+        if (lpInBuffer && nInBufferSize == sizeof(SERIAL_QUEUE_SIZE))
+            status = set_queue_size(fd, (const 
SERIAL_QUEUE_SIZE*)lpInBuffer);
+        else
+            status = STATUS_INVALID_PARAMETER;
+        break;
     case IOCTL_SERIAL_SET_TIMEOUTS:
         if (lpInBuffer && nInBufferSize == sizeof(SERIAL_TIMEOUTS))
             status = set_timeouts(hDevice, fd, (const 
SERIAL_TIMEOUTS*)lpInBuffer);
 
 
 
Comment 2 Константин Петров 2006-05-16 17:48:48 MSD
К сожалению сканер штрих-кода так и не работает.
Выводится следующее сообщение при попытке подключения стандартного
сканера /на 20 машинах именно так все у нас и работает в os windows/ в
меню "Настройка торгового оборудования" :
 
Сканер штрих-кода: ошибка при подключении
    Не удалось получить монопольный доступ у устройству
 
При попытке просмотреть вкладку "Сканер штрих-кода" в меню "Параметры"
программа немедленно улетает.
 
Библиотека SCANOPOS.DLL успешно зарегистрировалась командой regsvr32.
Comment 3 Константин Петров 2006-05-23 17:45:28 MSD
Описание работы с COM-портом с помощью WINAPI
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1126

В WINE@Etersoft 1.0.2 Network 1С77 + ТшС не падает при работе с меню 
Параметры\Сканер штрих-кода.

При попытке запустить стандартный сканер (компонента SCANOPOS.dll) выдается 
сообщение "Невозможно получить монопольный доступ к устройству".
Это говорит о том, что у Вас нет прав доступа к COM1.
1. Проверьте наличие ссылки com1 на требуемый файл устройства (/dev/ttyS0) в 
Вашем каталоге dosdevices.
2. Проверьте наличие прав на rw для файла устройства (в AltLinux /dev/ttyS0)
Компонента Scanopos.dll по умолчанию ищет устройство на COM1. В дальнейшем на 
вкладке настроек параметров можно сменить порт.

Со стандартной библиотекой SCANOPOS.DLL 1C вылетает при обращении ко вкладке 
настроек параметров устройств.
Поэтому рекомендую ее заменить улучшенной разработкой:
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=2&lid=3873

Лог WINE со стандартной SCANOPOS.DLL:
fixme:tab:TAB_GetCurFocus we have not to return negative valuewine: Unhandled 
page fault on read access to 0x00000004 at address 0x10013779 (thread 0009), 
starting debugger...
WineDbg starting on pid 0x8
Unhandled exception: page fault on read access to 0x00000004 in 32-bit code 
(0x10013779).
Register dump:
 CS:0073 SS:007b DS:007b ES:007b FS:003b GS:0033
 EIP:10013779 ESP:7fbfeb6c EBP:7fbfeb8c EFLAGS:00210297(   - 00     RISAP1C)
 EAX:7d9716b0 EBX:00000007 ECX:00000000 EDX:7d971540
 ESI:00000001 EDI:7d971570
Stack dump:
0x7fbfeb6c:  7d9716b0 000002f8 004361ac 10028048
0x7fbfeb7c:  7fbfeb70 7fbfeec0 10025c90 ffffffff
0x7fbfeb8c:  7fbfecd8 1f302692 7d971570 00000007
0x7fbfeb9c:  7dea90b0 e8edeecc 00f0eef2 00000000
0x7fbfebac:  1f3026e9 e3f5f3c1 e5f2ebe0 e8eaf1f0
0x7fbfebbc:  f2e820e5 00e8e3ee 7de897b0 7dbada30
Backtrace:
=>1 0x10013779 in scanopos (+0x13779) (0x10013779)
  2 0x1f302692 in frame (+0x2692) (0x1f302692)
  3 0x5f408eac in mfc42 (+0x8eac) (0x5f408eac)
  4 0x7fa76611 in user32 (+0x96611) (0x7fa76611)
  5 0x7fa10479 DefDlgProcA+0x84 in user32 (0x7fa10479)
  6 0x7fa762fa WINPROC_wrapper+0x1a in user32 (0x7fa762fa)
  7 0x7fa76611 in user32 (+0x96611) (0x7fa76611)
  8 0x7fa7b649 CallWindowProcA+0x43 in user32 (0x7fa7b649)
  9 0x5f4020f2 in mfc42 (+0x20f2) (0x5f4020f2)
  10 0x5f401902 in mfc42 (+0x1902) (0x5f401902)
  11 0x5f401cea in mfc42 (+0x1cea) (0x5f401cea)
  12 0x5f401c73 in mfc42 (+0x1c73) (0x5f401c73)
  13 0x5f401bfb in mfc42 (+0x1bfb) (0x5f401bfb)
  14 0x5f401bba in mfc42 (+0x1bba) (0x5f401bba)
  15 0x7fa762fa WINPROC_wrapper+0x1a in user32 (0x7fa762fa)
  16 0x7fa76611 in user32 (+0x96611) (0x7fa76611)
  17 0x7fa79740 in user32 (+0x99740) (0x7fa79740)
  18 0x7fa7e188 CallWindowProcW+0x92 in user32 (0x7fa7e188)
  19 0x7fa45943 in user32 (+0x65943) (0x7fa45943)
  20 0x7fa4a090 SendMessageTimeoutW+0x18e in user32 (0x7fa4a090)
  21 0x7fa4a0f1 SendMessageW+0x50 in user32 (0x7fa4a0f1)
  22 0x7fa1544f in user32 (+0x3544f) (0x7fa1544f)
  23 0x7fa1651c CreateDialogIndirectParamAorW+0x36 in user32 (0x7fa1651c)
  24 0x7fa1662d CreateDialogIndirectParamA+0x41 in user32 (0x7fa1662d)
  25 0x5f40a1a1 in mfc42 (+0xa1a1) (0x5f40a1a1)
  26 0x5f416b53 in mfc42 (+0x16b53) (0x5f416b53)
  27 0x1f304f52 in frame (+0x4f52) (0x1f304f52)
  28 0x5f4022ae in mfc42 (+0x22ae) (0x5f4022ae)

  29 0x0040b431 in 1cv7s (+0xb431) (0x0040b431)
0x10013779: call        *0x4(%ecx)
Modules:
Module  Address                 Debug info      Name (108 modules)
PE      0x00400000-00453000     Export          1cv7s
PE      0x10000000-10039000     Export          scanopos
PE      0x1f000000-1f013000     Deferred        type32
PE      0x1f100000-1f12c000     Deferred        dbeng32
PE      0x1f200000-1f22e000     Deferred        br32
PE      0x1f300000-1f395000     Export          frame
PE      0x1f400000-1f464000     Deferred        zlibeng
PE      0x20000000-202b1000     Deferred        bkend
PE      0x21000000-2102b000     Deferred        blang
PE      0x22000000-22150000     Deferred        seven
PE      0x23000000-2302d000     Deferred        txtedt
PE      0x25000000-25089000     Deferred        moxel
PE      0x26000000-26058000     Deferred        userdef
PE      0x27000000-27090000     Deferred        editr
PE      0x28000000-2807e000     Deferred        rgproc
PE      0x2a000000-2a147000     Deferred        basic
PE      0x2b000000-2b00d000     Deferred        trade
PE      0x2c000000-2c03b000     Deferred        salary
PE      0x2f000000-2f0db000     Deferred        account
PE      0x31000000-311c2000     Deferred        1crcrus
PE      0x40000000-400c7000     Deferred        rtl70.bpl
ELF     0x44159000-44284000     Deferred        libc.so.6
ELF     0x44286000-442a9000     Deferred        libm.so.6
ELF     0x442ab000-442af000     Deferred        libdl.so.2
ELF     0x442b1000-442b6000     Deferred        libxdmcp.so.6
ELF     0x442b8000-442bb000     Deferred        libxau.so.6
ELF     0x442bd000-443ad000     Deferred        libx11.so.6
ELF     0x443af000-443c2000     Deferred        libz.so.1
ELF     0x443c4000-443d3000     Deferred        libxext.so.6
ELF     0x444b6000-44508000     Deferred        libpthread.so.0
ELF     0x4450a000-44521000     Deferred        libice.so.6
ELF     0x44523000-4452c000     Deferred        libsm.so.6
ELF     0x4452e000-4459c000     Deferred        libfreetype.so.6
ELF     0x4459e000-445be000     Deferred        libexpat.so.1
ELF     0x445c0000-445ee000     Deferred        libfontconfig.so.1
ELF     0x445f0000-445f9000     Deferred        libxrender.so.1
ELF     0x44600000-44605000     Deferred        libxfixes.so.3
ELF     0x44607000-4460b000     Deferred        libxrandr.so.2
ELF     0x4460d000-44616000     Deferred        libxcursor.so
ELF     0x4466e000-4468a000     Deferred        libcups.so.2
ELF     0x446d0000-446d6000     Deferred        libxxf86dga.so.1
ELF     0x44735000-4473c000     Deferred        libdrm.so.2
ELF     0x44ec7000-44f2f000     Deferred        libgl.so.1
ELF     0x45852000-45953000     Deferred        libcrypto.so.4
ELF     0x45c44000-45c49000     Deferred        libxxf86vm.so.1
ELF     0x45e0e000-45e3f000     Deferred        libssl.so.4
ELF     0x4bbb2000-4bbc8000     Deferred        ld-linux.so.2
PE      0x5f300000-5f329000     Deferred        olepro32
PE      0x5f400000-5f4f2000     Export          mfc42
PE      0x65340000-653d2000     Deferred        oleaut32
PE      0x65f00000-65fc2000     Deferred        ole32
PE      0x70100000-70153000     Deferred        rpcrt4
PE      0x78000000-78044000     Deferred        msvcrt
ELF     0x7bf00000-7bf03000     Deferred        <wine-loader>
ELF     0x7d44c000-7d460000     Deferred        msimg32<elf>
  \-PE  0x7d450000-7d460000     \               msimg32
ELF     0x7d573000-7d596000     Deferred        netapi32<elf>
  \-PE  0x7d580000-7d596000     \               netapi32
ELF     0x7d596000-7d5b0000     Deferred        oledlg<elf>
  \-PE  0x7d5a0000-7d5b0000     \               oledlg
PE      0x7d5b0000-7d708000     Deferred        vcl70.bpl
ELF     0x7d712000-7d72f000     Deferred        iphlpapi<elf>
  \-PE  0x7d720000-7d72f000     \               iphlpapi
ELF     0x7d72f000-7d75a000     Deferred        ws2_32<elf>
  \-PE  0x7d740000-7d75a000     \               ws2_32
ELF     0x7d75a000-7d774000     Deferred        wsock32<elf>
  \-PE  0x7d760000-7d774000     \               wsock32
ELF     0x7d774000-7d788000     Deferred        lz32<elf>
  \-PE  0x7d780000-7d788000     \               lz32
ELF     0x7d788000-7d7a1000     Deferred        version<elf>
  \-PE  0x7d790000-7d7a1000     \               version
ELF     0x7d7a1000-7d7c0000     Deferred        mpr<elf>
  \-PE  0x7d7b0000-7d7c0000     \               mpr
PE      0x7d7c0000-7d8a7000     Deferred        fprnm1c
ELF     0x7e0bf000-7e160000     Deferred        comdlg32<elf>
  \-PE  0x7e0d0000-7e160000     \               comdlg32
ELF     0x7e607000-7e64e000     Deferred        riched20<elf>
  \-PE  0x7e620000-7e64e000     \               riched20
ELF     0x7e692000-7e6c0000     Deferred        winspool<elf>
  \-PE  0x7e6a0000-7e6c0000     \               winspool
ELF     0x7e6cc000-7e6e0000     Deferred        riched32<elf>
  \-PE  0x7e6d0000-7e6e0000     \               riched32
ELF     0x7e932000-7e935000     Deferred        libwine-etersoft.so.1
ELF     0x7e99d000-7e9d0000     Deferred        uxtheme<elf>
  \-PE  0x7e9b0000-7e9d0000     \               uxtheme
ELF     0x7f65c000-7f678000     Deferred        imm32<elf>
  \-PE  0x7f660000-7f678000     \               imm32
ELF     0x7f678000-7f6fa000     Deferred        winex11<elf>
  \-PE  0x7f690000-7f6fa000     \               winex11
ELF     0x7f6fa000-7f755000     Deferred        shlwapi<elf>
  \-PE  0x7f710000-7f755000     \               shlwapi
ELF     0x7f755000-7f832000     Deferred        shell32<elf>
  \-PE  0x7f770000-7f832000     \               shell32
ELF     0x7f832000-7f8ef000     Deferred        comctl32<elf>
  \-PE  0x7f840000-7f8ef000     \               comctl32
ELF     0x7f8ef000-7f930000     Deferred        advapi32<elf>
  \-PE  0x7f900000-7f930000     \               advapi32
ELF     0x7f930000-7f9bd000     Deferred        gdi32<elf>
  \-PE  0x7f940000-7f9bd000     \               gdi32
ELF     0x7f9bd000-7faf0000     Export          user32<elf>
  \-PE  0x7f9e0000-7faf0000     \               user32
ELF     0x7fc30000-7fd30000     Deferred        kernel32<elf>
  \-PE  0x7fc50000-7fd30000     \               kernel32
ELF     0x7fe41000-7ff37000     Deferred        libwine_unicode.so.1
ELF     0x7ff54000-7ff5e000     Deferred        libnss_files.so.2
ELF     0x7ff62000-7ffe0000     Deferred        ntdll<elf>
  \-PE  0x7ff70000-7ffe0000     \               ntdll
ELF     0xb7f3a000-b7f54000     Deferred        libwine.so.1
Threads:
process  tid      prio (all id:s are in hex)
0000000a
        0000000b    0
00000008 (D) C:\Program Files\1Cv77\BIN\1cv7s.exe
        0000000f    0
        0000000e    0
        00000009    0 <==
[wine@server BIN]$
Comment 4 Константин Петров 2006-05-23 18:58:22 MSD
Лучшим вариантом является установка драйверов от АТОЛа: 
Общий драйвер ККМ - http://download.atol.ru/soft/drv/kkm/kkm_5_18_2/KKM_5_18_2.
zip
Драйвер сканера штрих-кода - http://download.atol.ru/soft/drv/scaner/
scaner_5_8_1/Scaner_5_8_1.zip
Все остальное можно найти здесь http://atol.ru/download/

После установки драйверов проверьте, скопировались ли все необходимые файлы из 
из каталога ATOL/Drivers/BIN в каталог с базой 1С (например, DemoDB).
Зарегистрируйте новые библиотеки в каталоге Вашей базы:

wine regsvr32 FprnM1C.dll
wine FprnMLS.exe /REGSERVER
wine regsvr32 Scaner1C.dll

Утилиты FprnM_T.exe и Scaner_T.exe можно использовать для тестирования.

В панели Настройка торгового оборудования при установке указывается 
соответствующая библиотека (FprnM1C.dll, Scaner1C.dll). В поле AddIn 
записывается соответственно FprnM45 или Scaner45 (это пароль по умолчанию).
Также указывается использовать внешнюю компоненту, соответственно fr_comm.ert и 
sc_strih.ert

Для более подробных комментариев Вы можете прочитать pdf от Атола в каталоге 
установки ATOL/Drivers/Doc

Пробуйте, пишите комментарии
Comment 5 Константин Петров 2006-07-03 11:36:29 MSD
Created attachment 27 [details]
отредактированные исходники программы для проверки сканеров ChipherLab


> Проблема с обращением к COM-порту имеется и вылезает в консоль при 
тестировании:
> fixme:comm:SetupComm insize 16384 outsize 16384 unimplemented stub
>
>   

Но я бы не сказал, что совсем уж не работает. Вот прикрепленная программулина 
функционирует. Это как бы исходники для осуществления проверки сканеров 
ChipherLab с их сайта. Ее немного пришлось доработать напильником (функция 
kbhit() не работает в Wine). Кстати, ошибка

fixme:comm:SetupComm insize... при этом выдавалась
Comment 6 Vitaly Lipatov 2007-04-18 10:06:33 MSD
Надо проверить ещё раз. Судя по всему, патч у нас не приложен.
Comment 7 Константин Кондратюк 2007-04-18 13:30:33 MSD
Строки, добавляемые патчем присутствуют в файлах.
Пробуем писать тесты работы COM-порта.
Comment 8 Константин Кондратюк 2007-04-26 09:46:24 MSD
При передаче данных с параметрами по умолчанию (не настраивал DCB, а вытащил настройки с помощью GetCommState, менял только скорость - синхронизировал на 9600) всё передаётся исправно.
Comment 9 Константин Кондратюк 2007-04-27 12:30:25 MSD
Тест практически дописан. Осталось в файле выставлять нужные параметры порта.

Когда ставил скорость 9600 - случайно угадал, на других скоростях (110, 300 и 38400 проверял) передача зависает при использовании 1.0.6. При установке 1.0.5 при тех же условиях всё работает на всех скоростях.
Comment 10 Константин Кондратюк 2007-04-27 14:41:27 MSD
Всё-таки работает в 1.0.6. Проблема была в том, что данные отправлялись раньше, чем порт был готов их принять, и пропадали.
Выход - организовать двухсторонний обмен, чтобы не гадать с задержками.
Comment 11 Константин Кондратюк 2007-05-03 16:27:24 MSD
Проблема с повисанием порта, похоже, решена. Патч включён в сборку и отправлен в wine-patches. Нужно проверить, поможет ли новая сборка людям, у которых зависала передача.
Comment 12 Константин Кондратюк 2007-05-18 09:49:53 MSD
Суть проблемы с зацикливанием 1С ТИС в том, что программа в отдельном потоке ждёт события EV_RXFLAG. Wine не умеет его обрабатывать - отсюда 
fixme: comm: wait_on ...

Если подменять EV_RXFLAG маской EV_RXCHAR, то проблема с флагом обходится. Тест, ожидающий флага успешен, данные принимаются. Проблемой остаётся непонятное использование маски 0x81 (EV_RXCHAR|EV_ERR) в одной из баз ТИС.

Также есть проблемы с получением данных от сканера. По логам видно, что данные считываются, но в нужном поле формы они не появляются...
Comment 13 Михаил Карпухин 2007-05-31 10:49:24 MSD
ubuntu 7.04 ТИС wine 1.0.7, при поиске оборудования Scaner_t.exe загрузка системы 100% и виснет...
Comment 14 Константин Кондратюк 2007-05-31 11:00:25 MSD
Проблемы с POLLIN/POLLOUT и с EV_RXFLAG решены и тесты дают положительный результат. Зависания сохраняются (не всегда, если сканер подключился, то всё дальше работает!) из-за какой-то несогласованности в потоках.
Функция WaitForSingleObject ждёт наступления какого-то набора эвентов, который практически не получается в нынешнем wine+1C. 

Очень странно про загрузку системы. Обычно поток повисает вообще без загрузки (<1%).
Comment 15 Михаил Карпухин 2007-05-31 11:09:01 MSD
Created attachment 123 [details]
Загрузка процессора с поиском сканера
Comment 16 Михаил Карпухин 2007-05-31 11:09:36 MSD
скрин приложил...
Comment 17 Константин Кондратюк 2007-06-06 12:08:22 MSD
Бага с зависаниями выходит далеко за пределы своей темы и связана с ожиданием одного из потоков с помощью WaitForSingleObject эвента.

После закрытия баги с потоками нужно вернуться проверить.
Comment 18 Константин Кондратюк 2007-06-08 17:53:48 MSD
С драйверами от Атолла (20070413) всё подключается и не виснет. Т.е. эвенты воспринимаются нормально. Проверено на Scaner1C.dll (AddIn=Scaner45)
Похоже, проблема актуальна только для scanopos.dll.
Comment 19 Константин Кондратюк 2007-08-06 13:19:41 MSD
Возможно, проблемы стандартного драйвера не будет при использовании новой версии scanopos.dll:
http://softsearch.ru/programs/139-272-draiver-skanerov-shk-i-riderov-mk-download.shtml