Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.047 c
1-1155810465
GrBob
2006-08-17 14:27
2006.10.08
Variant и Int64


2-1158924616
jjj
2006-09-22 15:30
2006.10.08
ComboBox только для чтения


4-1148709908
Delphi_is_cool
2006-05-27 10:05
2006.10.08
Ресурсы(RCDATA->BITMAP ?)


3-1154678271
jiny
2006-08-04 11:57
2006.10.08
Права пользователей в программе


2-1158314448
SamProf
2006-09-15 14:00
2006.10.08
Как сделать вкладки с разным содержимым