Главная страница
    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.45 MB
Время: 0.043 c
15-1158205348
PSPF2003
2006-09-14 07:42
2006.10.08
Какой Linux?


2-1158829766
iamdanil
2006-09-21 13:09
2006.10.08
Общая папка (в сети)


3-1154501115
spogi
2006-08-02 10:45
2006.10.08
Is not a valid floating point value


6-1146944800
Satanist
2006-05-06 23:46
2006.10.08
Словить сlick в WebBrowser


2-1158445967
Vx
2006-09-17 02:32
2006.10.08
DirPath Подняться на уровень вверх





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский