Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизАсинхронное IO чтение/запись в порт. Найти похожие ветки
← →
POP (2006-09-17 20:49) [0]Асинхрон мне по идее не нужен, но приходиться его использовать чтобы не заморачиваться с таймаутами (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, но ведь в буфере по определению еще не весь ответ находиться.
Как определить что весь ответ уже пришел?
← →
XbI (2006-09-17 21:18) [1]сделай отдельным потоком чтение и отдельным запись...
cikl=false
while cikl=false do begin
ReadFile();
....
end;
← →
POP (2006-09-17 21:23) [2]
> сделай отдельным потоком чтение и отдельным запись...
> cikl=false
> while cikl=false do begin
> ReadFile();
> ....
> end;
Ты предлагаешь, непрерывно опрашивать порт ReadFile без всяких событий?
Ну это уже совсем кощунственно я думаю, так писать программы нельзя.
← →
XbI (2006-09-17 21:46) [3]http://sources.codenet.ru/download/968/COMPORT.html
← →
Германн © (2006-09-18 01:22) [4]
> POP (17.09.06 20:49)
Уже не первый раз ты сюда с этим вопросом. Скажи, использовать сторонние компоненты тебе что-то запрещает?
> Ты предлагаешь, непрерывно опрашивать порт ReadFile без
> всяких событий?
>
> Ну это уже совсем кощунственно я думаю, так писать программы
> нельзя.
Многие так и делают. Так проще. Репу чесать не нужно.
Более того, знаю таких, которые для каждого опроса (раз в секунду, а то и чаще) создают новый поток, открывают в нем порт, пишут в порт, пытаются читать из него ответ устройства, после получения ответа или по истечении заданного времени закрывают порт и уничтожают поток. И так ad infinitum!
← →
Германн © (2006-09-18 01:27) [5]Кстати. Если не поможет ссылка из [3], могу выслать исходники некоего бесплатного компонента, в котором реализована асинхроннная работа с СОМ-портом.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.043 c