Работа с Сом портом
При написании проги, у меня возникла проблема, решение кот. пока далеко. Задача весьма простая:
После отправки байта (вместе со стартовым и стоповым битами соответственно) ,нужно отследить момент когда будет передан последний бит( или когда сдвиговый регистр опустеет или когда на линии Tx установился постоянный отрицательный потенциал напряжения, соответственно после завершения передачи.) , т.к. после вышеуказанного события надо сбрасывать сигнал RTS. (потому что есть ограничения на временя активности сигнала RTS)
Нашел только единственное событие EV_TXEMPTY, связанное с процессом передати данных, но оно указывает что "Буфер предачи пуст", а это значит, что событие EV_TXEMPTY наступает по факту на много раньше чем фактическое завершение передачи последнего бита на линии Tx.
Если кто знает, подскажите, куды соваться??????
Если ты делаешь это создавая функцией CreateFile хэндлу с именем "COM1" (или какой там порт тебе нужен...) то тогда по этому хэндлу можно ждать событий с помощью функции WaitCommEvent, вторым параметром которого является маска событий, в которой собственно и сидит флаг EV_TXEMPTY.
Короче:
HANDLE hCom = CreateFile("COMx",....
DWORD mask = EV_TXEMPTY;
И потом когда тебе нужно ждать это событие, вызываешь:
WaitCommEvent(hCom,&mask,NULL);
Это событие возникает в момент когда из буфера отправки(того буфера который на модеме) в линию уходит последний байт - думаю тебе хватит и байтовой точности, учитывая наши линии связи :)
Всё.
и буквально на рисунке показал возникающую проблему.
Да чуть не забыл, ести написать прогу, в кот. просто отправляешь один байт, а затем по событию EV_TXEMPTY сбрасывать RTS, И ОБЯЗАТЕЛЬНО ПОСМОТРЕТЬ НА ОСЦИЛЛОПЕ, то результат будет еще плачевней. байтик будет передаваться посля среза RTS
Сработает для NT.