Загадка работы com-port с ReadFile и DCB structure после MS Hyper-Terminal
Столкнулся с непонятной проблемой.
Имеется сканер штрих-кодов CipherLab 1000.
Он настроен корректно, забегу вперед.
Для чистоты эксперимента удаляем порт из системы, переустанавливаем.
Смотрим, что у нас в ОС.
Далее делаем
GetCommState(hCom, &dcb);
Смотрим результат:
Уже странно...
Ладно, присваиваю свои значения, и отправляю...
SetCommState(hCom, &dcb);
Смотрю результат...
Вроде не плохо, под сканер...
Но вот не задача, сканирую, ничего не происходит... Висит и висит
ReadFile(hCom, &Buffer, 100, &dwBytesOfRead, NULL)
Никакой реакции....
А теперь самое странное!
Запускаю например MS Hyper Terminal просто connect к порту, да же не считываю данные сканером, закрываю программу.
Запускаю заново свою программу, проверяю состояние структуры... Она Аналогична. Какие настройки порта мог сменить Hyper Terminal. И как их менять мне?
И о чудо... Моя программа работает, никаких подвисаний, читает "файл" (порт) летом... Штрих код прилетает, всё хорошо, всё корректно.
Не могу понять в чем дело, заметил что запись идет успешно в любом случае, но там то это бесполезно, это же сканер...
Какие мысли? где искать проблему?
Код:
//должен совпадать 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);
//перед вызовом 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);
например так
Код:
btStringN += CString(Buffer);
Проблема то немного в другом...
До запуска 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"? а если сканер его не пошлет?
Тогда дальше так
N - Должна быть Больше 0 но меньше MAXDWORD
MAXDWORD =0x64
//detail такой комбинации [Цитата]
//в буфере есть байты ReadFile немедленно вернет байты из буфера.
//если нет байтов в буфере ReadFile ждет байт
//если Timeout > N ReadFile режим ожидания
Сделал так...
#define TIMEOUT 0
CommTimeOuts.ReadIntervalTimeout = 10;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = TIMEOUT;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = TIMEOUT;
Код:
#define TIMEOUT 0
В вашем случаи это может работать до определенного момента
Как-бы там не было нужно обработать Error ыначе жидкое состояния программы будет!!!
Ведь сканер не для себя нужен.
Ну раз работает так работает.
Удачи!