![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Асинхронное IO чтение/запись в порт.
POP © (2006-09-17 20:49:00)Асинхрон мне по идее не нужен, но приходиться его использовать чтобы не заморачиваться с таймаутами (SetCommTimeouts), тк в этом случае их все можно установить в ноль, то есть не используются (что я и сделал).
Для записи использую такую комбинацию:
--
SetCommMask(ComFile,EV_TXEMPTY);
WriteFile(ComFile, s[1], Length(s), BytesWritten, @Overlapped);
WaitCommEvent(ComFile,Mask,nil);
--
Как видите я в WaitCommEvent использую NIL хотя порт открыт в асинхроне, это не роляет, тк данные так и так уйдут, даже если модем выключен. Неответ модема я собираюсь контролировать по чтению.
С чтением проблемы, в простейшем случае пока потоки не юзаю, а хочу читать сразу после записи.
Самая проблема это как определить и разграничить конец приема ответа модема или неответ модема(например он выключен).
Можно было бы отслеживать символ перевода каретки (#10) и таким образом определять что это конец ответа модема и начинать чтение, но #10 не всегда является концом ответа, он еще и в середине встречается в разных случаях.
Значит как я понимаю нужно назначать событие EV_RXCHAR, то есть приход первого байта и в цикле WaitCommEvent ждать наступления этого события(потоки пока не трогаем).
А если это событие не наступает, то есть модем не отвечает, как тогда быть?
Хорошо, этот первый символ пришел, сразу делаем ClearCommError чтобы определить сколько байт в буфере и передать их на чтение ReadFile, но ведь в буфере по определению еще не весь ответ находиться.
Как определить что весь ответ уже пришел?
Германн (2006-09-18 01:27:00) [1]Кстати. Если не поможет ссылка из [3], могу выслать исходники некоего бесплатного компонента, в котором реализована асинхроннная работа с СОМ-портом.
Германн (2006-09-18 01:22:00) [2]
> POP (17.09.06 20:49)
Уже не первый раз ты сюда с этим вопросом. Скажи, использовать сторонние компоненты тебе что-то запрещает?
> Ты предлагаешь, непрерывно опрашивать порт ReadFile без
> всяких событий?
>
> Ну это уже совсем кощунственно я думаю, так писать программы
> нельзя.
Многие так и делают. Так проще. Репу чесать не нужно.
Более того, знаю таких, которые для каждого опроса (раз в секунду, а то и чаще) создают новый поток, открывают в нем порт, пишут в порт, пытаются читать из него ответ устройства, после получения ответа или по истечении заданного времени закрывают порт и уничтожают поток. И так ad infinitum!
XbI (2006-09-17 21:46:00) [3]http://sources.codenet.ru/download/968/COMPORT.html
POP (2006-09-17 21:23:00) [4]
> сделай отдельным потоком чтение и отдельным запись...
> cikl=false
> while cikl=false do begin
> ReadFile();
> ....
> end;
Ты предлагаешь, непрерывно опрашивать порт ReadFile без всяких событий?
Ну это уже совсем кощунственно я думаю, так писать программы нельзя.
XbI (2006-09-17 21:18:00) [5]сделай отдельным потоком чтение и отдельным запись...
cikl=false
while cikl=false do begin
ReadFile();
....
end;