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
Появился патч, тестируем [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); К сожалению сканер штрих-кода так и не работает. Выводится следующее сообщение при попытке подключения стандартного сканера /на 20 машинах именно так все у нас и работает в os windows/ в меню "Настройка торгового оборудования" : Сканер штрих-кода: ошибка при подключении Не удалось получить монопольный доступ у устройству При попытке просмотреть вкладку "Сканер штрих-кода" в меню "Параметры" программа немедленно улетает. Библиотека SCANOPOS.DLL успешно зарегистрировалась командой regsvr32. Описание работы с 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]$ Лучшим вариантом является установка драйверов от АТОЛа: Общий драйвер ККМ - 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 Пробуйте, пишите комментарии Created attachment 27 [details] отредактированные исходники программы для проверки сканеров ChipherLab > Проблема с обращением к COM-порту имеется и вылезает в консоль при тестировании: > fixme:comm:SetupComm insize 16384 outsize 16384 unimplemented stub > > Но я бы не сказал, что совсем уж не работает. Вот прикрепленная программулина функционирует. Это как бы исходники для осуществления проверки сканеров ChipherLab с их сайта. Ее немного пришлось доработать напильником (функция kbhit() не работает в Wine). Кстати, ошибка fixme:comm:SetupComm insize... при этом выдавалась Надо проверить ещё раз. Судя по всему, патч у нас не приложен. Строки, добавляемые патчем присутствуют в файлах. Пробуем писать тесты работы COM-порта. При передаче данных с параметрами по умолчанию (не настраивал DCB, а вытащил настройки с помощью GetCommState, менял только скорость - синхронизировал на 9600) всё передаётся исправно. Тест практически дописан. Осталось в файле выставлять нужные параметры порта. Когда ставил скорость 9600 - случайно угадал, на других скоростях (110, 300 и 38400 проверял) передача зависает при использовании 1.0.6. При установке 1.0.5 при тех же условиях всё работает на всех скоростях. Всё-таки работает в 1.0.6. Проблема была в том, что данные отправлялись раньше, чем порт был готов их принять, и пропадали. Выход - организовать двухсторонний обмен, чтобы не гадать с задержками. Проблема с повисанием порта, похоже, решена. Патч включён в сборку и отправлен в wine-patches. Нужно проверить, поможет ли новая сборка людям, у которых зависала передача. Суть проблемы с зацикливанием 1С ТИС в том, что программа в отдельном потоке ждёт события EV_RXFLAG. Wine не умеет его обрабатывать - отсюда fixme: comm: wait_on ... Если подменять EV_RXFLAG маской EV_RXCHAR, то проблема с флагом обходится. Тест, ожидающий флага успешен, данные принимаются. Проблемой остаётся непонятное использование маски 0x81 (EV_RXCHAR|EV_ERR) в одной из баз ТИС. Также есть проблемы с получением данных от сканера. По логам видно, что данные считываются, но в нужном поле формы они не появляются... ubuntu 7.04 ТИС wine 1.0.7, при поиске оборудования Scaner_t.exe загрузка системы 100% и виснет... Проблемы с POLLIN/POLLOUT и с EV_RXFLAG решены и тесты дают положительный результат. Зависания сохраняются (не всегда, если сканер подключился, то всё дальше работает!) из-за какой-то несогласованности в потоках. Функция WaitForSingleObject ждёт наступления какого-то набора эвентов, который практически не получается в нынешнем wine+1C. Очень странно про загрузку системы. Обычно поток повисает вообще без загрузки (<1%). Created attachment 123 [details]
Загрузка процессора с поиском сканера
скрин приложил... Бага с зависаниями выходит далеко за пределы своей темы и связана с ожиданием одного из потоков с помощью WaitForSingleObject эвента. После закрытия баги с потоками нужно вернуться проверить. С драйверами от Атолла (20070413) всё подключается и не виснет. Т.е. эвенты воспринимаются нормально. Проверено на Scaner1C.dll (AddIn=Scaner45) Похоже, проблема актуальна только для scanopos.dll. Возможно, проблемы стандартного драйвера не будет при использовании новой версии scanopos.dll: http://softsearch.ru/programs/139-272-draiver-skanerov-shk-i-riderov-mk-download.shtml |