Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с com-портом [D5, Win95/98]


Ruslan ©   (2002-03-11 16:01:00) 

Как избежать подвисания ф-ции ReadFile(), которую я использую для считывания данных с соm-порта.


gluka   (2002-03-28 15:46:00) [1]

А где бы его взять (VARIAN ASYNC32 COMPONENT)?!?!?!
Желательно под Д5 Д6!!!


Master Denis   (2002-03-28 14:33:00) [2]

А я обычно использую библиотеку PComm от www.moxa.com (бесплатно) там когда читаешь порт, а буффер пуст функция выдает тебе -1 и не подвисает! Красота.


Лёша   (2002-03-19 16:33:00) [3]

2 erik © (19.03.02 14:32)
Абсолютная правда.
Юзать компоненты, ДДК и всякие ядрённые агенты нужно в том случае, когда собираешся годами сидеть только на разработке драйверов.
Кстати, и о Делфи придётся забыть


erik   (2002-03-19 14:32:00) [4]

To EsKor
А ты используй OVERLAPPED-режим и никакие таймауты тебе непотребуются. Еще раз всем напопинаю ненадо самодеятельности, хороший драйвер для com порта вы напишите через 2 года работы. Я перебрал порядка 50 компонентов с исходными кода и писал свои. Но когда посмотрел на VARIAN ASYNC32 понял, что все написаное мною это ерунда.
Очень много людй прошли этот путь, неповторяйте чущие ошибки, используйте готовые решения! Могу прислать компонент желающим.


EsKor   (2002-03-19 02:44:00) [5]

Обычно ф-ция ReadFile() подвисает, когда таймауты для чтения нулевые, точнее первый из них (см. ниже):
ReadIntervalTimeout:=MAXDWORD; //При MAXDWORD и остальных нулях при чтении
ReadTotalTimeoutMultiplier:=0; //возвращается результат (без ожидания) даже
ReadTotalTimeoutConstant:=0; //если в порт ничего не поступило

Может быть "остальные" и не обязательно должный быть равны нулю (не проверял), но поскольку в этом случае смысла не имеют, то лучше их приравнивать нулю.

По идее, ReadIntervalTimeout - это время отводимое на прием одного байта данных, ReadTotalTimeoutMultiplier - это количество ожидающихся байтов байтов, ReadTotalTimeoutConstant - это некоторая добавка к времени отводимому на чтение всех байтов (про запас).
Но с этими таймаутами тоже не так просто получается. Кого интересует посмотрите мой вчерашний вопрос "Таймауты при чтении COM-порта" на этом форуме (до сих пор не отвеченный).


erik   (2002-03-18 13:28:00) [6]

Использй компонент для считывния например VARIAN ASYNC32 COMPONENT v1.48. Сохраниш много здоровя.


digitman   (2002-03-18 11:29:00) [7]

В осн.потоке используй OVERLAPPED-режим для файловых операций.
См. флаг FILE_FLAG_OVERLAPPED в описании CreateFile(), ReadFile()


Step   (2002-03-17 18:03:00) [8]

Считывать по байту и в отдельном потоке - работает безотказно.


Shaman_Naydak   (2002-03-11 20:11:00) [9]

>>
Нет, Fox SW, это ты не прав!!! :)
а) затормозится поток, а не прога
б) можно вызвать так, чтобы не тормозила и отдавала только то, что уже есть


Fox SW   (2002-03-11 19:19:00) [10]

Shaman, ты не прав !!! Отдельный поток никчему не приведёт и вызовет зависание базового класса. Дело в том, что если ты пытаешься считать из порта больше, чем там есть (в буффере этого порта) то системма блокирует твою прогу до тех пор, пока в буффере не появится недостающий фрагмент.

Короче

Делаешь так:

Var CS: tCommStatus;
DW: DWord

ClearCommError(H, DW, CS);
Len:= CS.cbOutQue;
ReadFile(H, Buffer, Len);


Ruslan   (2002-03-11 17:45:00) [11]

А можешь подробнее разъяснить?


Shaman_Naydak   (2002-03-11 17:29:00) [12]

вынести ее для работы в отдельный поток


Наверх

Титульная страница Поиск, карта сайта Написать письмо