Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Вниз

Непонятки с USB сканером с эмуляцией COM. Не работает RXFLAG.   Найти похожие ветки 

 
Skyle ©   (2008-12-09 08:15) [0]

Есть сканер (Metrologic MS9520), подключен через USB в режиме эмуляции COM-порта (Uni-directional USB Emulation Mode). Есть самописный класс для работы с портом. До этого использовались только честные ком-портовые сканеры и прочие весы, USB впервые. По некоторым причинам чтение реализовано через маску EVT_RXFLAG or EVT_ERR. В DCB.evtChar стоит #13, сканер настроен на посылку #13 после каждого штрих-кода (Enable CR suffix, Disable LF Suffix).

Установку маски контролирую через PortMon от Руссиновича, маска и DBC.evtChr выставляется какие указано.

IOCTL_SERIAL_SET_CHAR SUCCESS EOF:0 ERR:0 BRK:0 EVT:d XON:11 XOFF:13
IOCTL_SERIAL_SET_WAIT_MASK SUCCESS Mask: RXFLAG ERR  

Далее пытаюсь принимать данные через "демо-программу", написаную с использованием CPort. Она добавляет в маску все флаги. Сканирую 13-значный штрих-код. Эта демо-программа показывает две посылки

46022120
01002/0x0D

То есть сканер честно отдаёт #13.

Читаем MSDN про SetCommMask, EVT_RXFLAG
The event character was received and placed in the input buffer. The event character is specified in the device"s DCB structure, which is applied to a serial port by using the SetCommState function.

Но при подключении с моей маской (EVT_RXFLAG or EVT_ERR) я ничего не получаю, продолжая висеть на WaitCommEvent.
При этом, соответственно, PortMon также не ловит ничего от сканера.

Мой вопрос заключается в следующем: почему сканер отдаёт символ #13, но WaitCommMask не ловит EVT_RXFLAG?


 
GanibalLector ©   (2008-12-09 11:01) [1]

17 строку смотрел ?
Код показывай


 
Skyle ©   (2008-12-09 11:17) [2]

Ну что там показывать.. Кстати, если взять CPort с той же маской (EVT_RXFLAG or EVT_ERR), то эффект тот же - молчит и не видит данных.

Показываю суть, обработку ошибок убрал.

Открытие порта
PortHandle := CreateFile(PChar(FPortName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
SetupComm(PortHandle, 4096, 0);

GetCommState(PortHandle, DCB);
DCB.BaudRate := FBaudRate;
DCB.ByteSize := FByteSize;
DCB.Parity := byte(FParity);
DCB.StopBits := byte(FStopBits);
DCB.XonLim := 256;
DCB.XoffLim := 256;
DCB.EvtChar := #13;
SetCommState(PortHandle, DCB);

CommTimeOuts.ReadIntervalTimeOut := 50;
CommTimeOuts.ReadTotalTimeOutMultiplier := 0;
CommTimeOuts.ReadTotalTimeOutConstant := 0;
CommTimeOuts.WriteTotalTimeOutMultiplier := 0;
CommTimeOuts.WriteTotalTimeoutConstant := 0;
SetCommTimeOuts(self.PortHandle, CommTimeOuts);
SetCommMask(PortHandle, EV_ERR or EV_RXFLAG);


Далее хэндл порта отдаётся в читающий поток, в котором имеется вот такая конструкция

var
 Ovr: TOverlapped;
begin
 Fillchar(Ovr, sizeof(Ovr), 0);
 SyncObjs[0] := CreateEvent(nil, true, false, nil);
 Ovr.hEvent := SyncObjs[0];
 SyncObjs[1] := OpenEvent(0, true, PChar(cExitEventName + IntToStr(Application.Handle)));
 SyncObjs[2] := OpenEvent(0, true, PChar(cReadEventName + IntToStr(Application.Handle)));
 OvrRead.hEvent := SyncObjs[2];
 while not Terminated do
 begin
   WaitMask := 0;
   WaitCommEvent(PortHandle, WaitMask, @Ovr);
   Res := WaitForMultipleObjects(3, @SyncObjs[0], false, INFINITE);
   case Res of
   WAIT_OBJECT_0:      
      begin
        if (WaitMask AND EV_RXFLAG) = EV_RXFLAG then
          //Попытка чтения с использованием ovrRead
      end;
    WAIT_OBJECT_0 + 1:  ///Это событие выхода
         begin
           break;
         end;
    WAIT_OBJECT_0 + 2:          
    begin
        GetOverlappedResult(PortHandle, OvrRead, Count, true);
    end;
 end;
end;


Само чтение меня сейчас как-то не очень интересует. Я в данном случае в case не попадаю. И в PortMon пусто.


 
tesseract ©   (2008-12-09 12:16) [3]


> SetCommMask(PortHandle, EV_ERR or EV_RXFLAG);


not EV_RING забыл. Я ж тебе говорил, что поддержка драйвером всех евентов  - не факт.


 
Германн ©   (2008-12-09 12:33) [4]


> Я ж тебе говорил, что поддержка драйвером всех евентов  
> - не факт.

+1


 
Skyle ©   (2008-12-09 12:40) [5]


> tesseract ©   (09.12.08 12:16) [3]
> not EV_RING забыл. Я ж тебе говорил, что поддержка драйвером
> всех евентов  - не факт.

Да, говорил, было дело. В данном случае я явно могу предположить, что этот драйвер мне EVT_RXFLAG не отправляет. Но тогда разверни про not EVT_RING, я как-то не осилил.


> Германн ©   (09.12.08 12:33) [4]
> +1

ненене, ты мне этого не говорил :)


 
Германн ©   (2008-12-09 12:49) [6]


> Skyle ©   (09.12.08 12:40) [5]

Я много чего тебе не говорил про драйверы. :)


 
Германн ©   (2008-12-09 12:50) [7]


> Skyle ©   (09.12.08 12:40) [5]

Я много чего тебе не говорил про драйверы. :)


 
Skyle ©   (2008-12-09 12:51) [8]


> Германн ©   (09.12.08 12:49) [6]

Мне достаточно будет, если ты сейчас со всей ответственностью скажешь, что да, действительно, этот грёбаный драйвер моего грёбаного сканера ни в жисть не даст мне EVT_RXCHAR, потому что он жмот и сволочь.

И я радостно выставлю заказчику конский ценник на переделку работы на какой-нибудь EV_RLSD и перестану хотеть от этого сканера странного.


 
tesseract ©   (2008-12-09 13:19) [9]


> Но тогда разверни про not EVT_RING, я как-то не осилил.


В windows XP рекомендуеться стваить, у Агурова что-то было по этому поводу.


 
Skyle ©   (2008-12-09 13:35) [10]


> tesseract ©   (09.12.08 13:19) [9]

Ты предлагаешь маску

EVT_RXFLAG or EV_ERR or EV_RING

?

В моём случае также не работает.


 
Вариант   (2008-12-09 14:05) [11]


> tesseract ©   (09.12.08 13:19) [9]

Флаги событий битовые. Если установить маску not EV_RING, то это разрешит все события, кроме события получения сигнала звонка. Сигнал звонка вроде тут и не нужен. Но почему в XP это рекомендуют ставить? Для модемов это событие отрабатывает нормально. В 98 , если не совру, его не было..


> Skyle ©   (09.12.08 12:51) [8]


> Мне достаточно будет, если ты сейчас со всей ответственностью
> скажешь, что да, действительно, этот грёбаный драйвер моего
> грёбаного сканера ни в жисть не даст мне EVT_RXCHAR,


А кстати в начале про RXFLAG(ну может и правда не срабатывает, не скажу не знаю про твой случай), а тут про RXCHAR - а вот с RXCHAR  попробовал бы. Ну парсил бы сам приходящие символы - ничего страшного.

А потом есть вопросы по
тому - а всегда ли функции CreateFile, WaitCimmEvent, CreateEvent,SetCommMask и прочие выполняются без ошибки - анализа нет, может при отладке это допустимо, но ты по дебаггеру проверяешь, что все вернулось ок? И как ты это проверяешь, ведь даже присвоений кодов возврата функций не видно в коде?


 
Вариант   (2008-12-09 14:21) [12]


> Skyle ©   (09.12.08 08:15)  
> IOCTL_SERIAL_SET_CHAR SUCCESS EOF:0 ERR:0 BRK:0 EVT:d XON:
> 11 XOFF:13

В догонку - ммм EVT:d   = XOFF:13 - если включен XON/XOFF - а не будет ли конфликтов с событием RXFLAG - я этого не знаю, сказать не могу, не пробовал сам. А вот у тебя XON/XOFF в неизвестно включен ли или нет, так как ты не работаешь с этим битом разрешения в DCB явно. Тоже возможный вариант...


 
tesseract ©   (2008-12-09 15:32) [13]


> В 98 , если не совру, его не было..


Да не было, и прямого доступа в 98-м не было. Нафиг он нужен - не помню уже, вроде баг какой-то в дровах то-ли под w2k,  то ли под XP.


 
Skyle ©   (2008-12-10 06:38) [14]


> Вариант   (09.12.08 14:05) [11]


> а всегда ли функции CreateFile, WaitCimmEvent, CreateEvent,
> SetCommMask и прочие выполняются без ошибки - анализа нет,
>

Я сразу написал


> Skyle ©   (09.12.08 11:17) [2]
> Показываю суть, обработку ошибок убрал.



> а вот с RXCHAR  попробовал бы.

Это всё понятно. Сейчас работает через RXFLAG (изначально было через EV_RLSD, но на некоторых машинах с 98-й оно не приходило), можно переделать. Но сначала хотелось убедиться, что заставить этот сканер работать через RXFLAG невозможно.

Про XON/XOFF сейчас посмотрю.


 
Skyle ©   (2008-12-10 06:51) [15]

fOutX не используется. DCB.Flags = 1, то есть fBinary.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.004 c
2-1260564996
DIM
2009-12-11 23:56
2010.02.07
Не понятно откуда берется такое значение переменной


15-1259910918
tesseract
2009-12-04 10:15
2010.02.07
Тяпница в бочке


2-1260482915
Aleks
2009-12-11 01:08
2010.02.07
динамически создаваемые объекты как их удалить?


2-1260364091
abhtr
2009-12-09 16:08
2010.02.07
Помогите перевести str1 := =?UTF-8?B?0JrQsNC6INC/0L7QsdC...


15-1259734968
matveih1
2009-12-02 09:22
2010.02.07
Как показать направление сортировки в DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский