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

Ваш аккаунт

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

Последние темы форума

Показать новые сообщения »

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

Подписчиков: 6301
Последний выпуск: 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. И как их менять мне?

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

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

Какие мысли? где искать проблему?
326
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"? а если сканер его не пошлет?
326
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;
326
01 ноября 2017 года
UserNet2008
748 / / 03.04.2010
 
Код:
#define TIMEOUT 0
Я напечатал выше N - Должна быть Больше 0 но меньше MAXDWORD
В вашем случаи это может работать до определенного момента
Как-бы там не было нужно обработать Error ыначе жидкое состояния программы будет!!!
Ведь сканер не для себя нужен.
Ну раз работает так работает.
Удачи!
55K
06 июля 2018 года
ЗАРАБОТОК КРИПТОВАЛЮТЫ
202 / / 06.07.2018
____________________
Заработок от 20 000 рублей в день !!!
- Вам нужен готовый, уже настроенный метод заработка?
- Без сложных курсов, в которых вы не можете разобраться.
- Без рутинной работы.
- Без обмана и чтобы деньги были достойные.
- Именно готовый заработок, а не бесполезный курс!
Подробности на сaйте http://mod-servis.ru

____________________
Заработок от 20 000 рублей в день !!!

- Вам нужен готовый, уже настроенный метод заработка?
- Без сложных курсов, в которых вы не можете разобраться.
- Без рутинной работы.
- Без обмана и чтобы деньги были достойные.
- Именно готовый заработок, а не бесполезный курс!
Подробности на сaйте http://mod-servis.ru

____________________

76302

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог