Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Асинхронное 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.046 c
4-1148801284
Хочу_все_знать
2006-05-28 11:28
2006.10.08
Как узнать во время работы программы что запустили другую


15-1158407995
cyborg
2006-09-16 15:59
2006.10.08
В упор не найду TabSet в компонентах


15-1158217336
boalse
2006-09-14 11:02
2006.10.08
Ещё оптический обман


15-1158673674
DillerXX
2006-09-19 17:47
2006.10.08
Возможно ли найти что-то новое?


2-1158920627
mfender
2006-09-22 14:23
2006.10.08
Метод класса в производном классе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский