• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

K

Kenny™

Доброго времени суток!

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

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


Далее делаем

GetCommState(hCom, &dcb);

Смотрим результат:
DEF-1.PNG


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

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

SetCommState(hCom, &dcb);

Смотрю результат...
REZ-1.PNG


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

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

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

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

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

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

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

Какие мысли? где искать проблему?
 
K

Kenny™

Проблема, решена. Конечно же, про COMMTIMEOUTS забыл... Cмотрю, что Hyper-Terminal ее инициализирует в порт, а моя программа нет.

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

C++:
#define TIMEOUT 0

CommTimeOuts.ReadIntervalTimeout = 10;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!