Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.02.07;
Скачать: CL | DM;

Вниз

Непонятки с 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 вся ветка

Текущий архив: 2010.02.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
4-1228802818
DimonS
2008-12-09 09:06
2010.02.07
Как реализовать чтение iButton?


1-1236164057
dmitry1208197320
2009-03-04 13:54
2010.02.07
Управление размерами картинки при её вставке в Word


15-1259755160
Palladin
2009-12-02 14:59
2010.02.07
"Облагораживание" Windows XP


3-1234339703
July
2009-02-11 11:08
2010.02.07
можно ли сделать delay в ХП IB7.5?


11-1210599832
Valera
2008-05-12 17:43
2010.02.07
Проблема со ScrollBox.