Форум: "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