Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Загадка работы com-port с ReadFile и DCB structure после MS Hyper-Terminal

88K
31 октября 2017 года
Kenny™
3 / / 31.10.2017
Доброго времени суток!

Столкнулся с непонятной проблемой.
Имеется сканер штрих-кодов CipherLab 1000.
Он настроен корректно, забегу вперед.
Для чистоты эксперимента удаляем порт из системы, переустанавливаем.

Смотрим, что у нас в ОС.

Далее делаем

GetCommState(hCom, &dcb);

Смотрим результат:

Уже странно...

Ладно, присваиваю свои значения, и отправляю...

SetCommState(hCom, &dcb);

Смотрю результат...

Вроде не плохо, под сканер...

Но вот не задача, сканирую, ничего не происходит... Висит и висит
ReadFile(hCom, &Buffer, 100, &dwBytesOfRead, NULL)

Никакой реакции....

А теперь самое странное!
Запускаю например MS Hyper Terminal просто connect к порту, да же не считываю данные сканером, закрываю программу.

Запускаю заново свою программу, проверяю состояние структуры... Она Аналогична. Какие настройки порта мог сменить Hyper Terminal. И как их менять мне?

И о чудо... Моя программа работает, никаких подвисаний, читает "файл" (порт) летом... Штрих код прилетает, всё хорошо, всё корректно.

Не могу понять в чем дело, заметил что запись идет успешно в любом случае, но там то это бесполезно, это же сканер...

Какие мысли? где искать проблему?
327
01 ноября 2017 года
UserNet2008
748 / / 03.04.2010
Проблема в том ,что я не имею сканера и приходиться отвечать гипотетически т.е на УРА.
Код:
//должен совпадать WriteFile and ReadFile

//перед вызовом ReadFile/WriteFile
dwBytesOfRead=0;
ReadFile/WriteFile(hCom,&Buffer,100,&dwBytesOfRead,NULL)
// or
ReadFile/WriteFile(hCom,&Buffer,100,&dwBytesOfRead,0)
// or
ReadFile/WriteFile(hCom,&Buffer,100,NULL,0)

//нужно каждый раз закрыть hCom CloseHandle(hCom);
Возник вопрос почему 100 если асинхронно то байт-за-байтом
например так
 
Код:
btStringN += CString(Buffer);
88K
01 ноября 2017 года
Kenny™
3 / / 31.10.2017
Поставил сниффер, между портом ОС и устройством для ловли пакетов... Все равно не ясно.

Проблема то немного в другом...
До запуска Hyper-Terminal
ReadFile(hCom, &Buffer, 0x64, &dwBytesOfRead, NULL)
Ждет пока не наполнится буфер 100 байтами, и только потом отдает управление дальше программе. В обще не важно да же сколько байт, пока буфер не забит устройством, висит... Будь это огромный штрих код, будет 2-3 символа. Если конечно 1-2 символ, то всё будет работать, при правильном буфере 2-4 байта.
Далее берем запускаем Hyper-Terminal (Просто захватить / отпустить порт, ну можно и считать сканером)
После этого, запускаю снова мою программу ReadFile(hCom, &Buffer, 0x64, &dwBytesOfRead, NULL)

Теперь ничего не ждет, сколько раз прилетит и какой объем не важно, программа работает.


Вот и вопрос, как так происходит? Проверял в Сниффере, гипер терминал в регистры дописывает ниже, может это влиять?

ReadIntervalTimeout=10
ReadTotalTimeoutMultiplier=0
ReadTotalTimeoutConstant=0
WriteTotalTimeoutMultiplier=0
WriteTotalTimeoutConstant=5000
WaitMask=RLSD: RLSD changed state, ERR: Line status error occurred
Purge mask=TXABORT: Read requests, RXABORT: Receive buffer


Предлагаете всегда читать по 1 байту? Тогда когда узнать конец? по "/0"? а если сканер его не пошлет?
327
01 ноября 2017 года
UserNet2008
748 / / 03.04.2010
Вы пробывали все три варианта выше?
Тогда дальше так
Цитата:
ReadIntervalTimeout=MAXDWORD
ReadTotalTimeoutMultiplier=MAXDWORD
ReadTotalTimeoutConstant=N

N - Должна быть Больше 0 но меньше MAXDWORD
MAXDWORD =0x64
//detail такой комбинации [Цитата]
//в буфере есть байты ReadFile немедленно вернет байты из буфера.
//если нет байтов в буфере ReadFile ждет байт
//если Timeout > N ReadFile режим ожидания

88K
01 ноября 2017 года
Kenny™
3 / / 31.10.2017
Проблема, решена. Конечно же, про COMMTIMEOUTS забыл... Я то и смотрю, что Hyper-Terminal ее инициализирует в порт, а моя программа нет.

Сделал так...

#define TIMEOUT 0

CommTimeOuts.ReadIntervalTimeout = 10;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
327
01 ноября 2017 года
UserNet2008
748 / / 03.04.2010
 
Код:
#define TIMEOUT 0
Я напечатал выше N - Должна быть Больше 0 но меньше MAXDWORD
В вашем случаи это может работать до определенного момента
Как-бы там не было нужно обработать Error ыначе жидкое состояния программы будет!!!
Ведь сканер не для себя нужен.
Ну раз работает так работает.
Удачи!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог