Форум: "Система";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Вниз
Работа с com-портом Найти похожие ветки
← →
Ruslan (2002-03-11 16:01) [0]Как избежать подвисания ф-ции ReadFile(), которую я использую для считывания данных с соm-порта.
← →
Shaman_Naydak (2002-03-11 17:29) [1]вынести ее для работы в отдельный поток
← →
Ruslan (2002-03-11 17:45) [2]А можешь подробнее разъяснить?
← →
Fox SW (2002-03-11 19:19) [3]Shaman, ты не прав !!! Отдельный поток никчему не приведёт и вызовет зависание базового класса. Дело в том, что если ты пытаешься считать из порта больше, чем там есть (в буффере этого порта) то системма блокирует твою прогу до тех пор, пока в буффере не появится недостающий фрагмент.
Короче
Делаешь так:
Var CS: tCommStatus;
DW: DWord
ClearCommError(H, DW, CS);
Len:= CS.cbOutQue;
ReadFile(H, Buffer, Len);
← →
Shaman_Naydak (2002-03-11 20:11) [4]>>
Нет, Fox SW, это ты не прав!!! :)
а) затормозится поток, а не прога
б) можно вызвать так, чтобы не тормозила и отдавала только то, что уже есть
← →
Step (2002-03-17 18:03) [5]Считывать по байту и в отдельном потоке - работает безотказно.
← →
digitman (2002-03-18 11:29) [6]В осн.потоке используй OVERLAPPED-режим для файловых операций.
См. флаг FILE_FLAG_OVERLAPPED в описании CreateFile(), ReadFile()
← →
erik (2002-03-18 13:28) [7]Использй компонент для считывния например VARIAN ASYNC32 COMPONENT v1.48. Сохраниш много здоровя.
← →
EsKor (2002-03-19 02:44) [8]Обычно ф-ция ReadFile() подвисает, когда таймауты для чтения нулевые, точнее первый из них (см. ниже):
ReadIntervalTimeout:=MAXDWORD; //При MAXDWORD и остальных нулях при чтении
ReadTotalTimeoutMultiplier:=0; //возвращается результат (без ожидания) даже
ReadTotalTimeoutConstant:=0; //если в порт ничего не поступило
Может быть "остальные" и не обязательно должный быть равны нулю (не проверял), но поскольку в этом случае смысла не имеют, то лучше их приравнивать нулю.
По идее, ReadIntervalTimeout - это время отводимое на прием одного байта данных, ReadTotalTimeoutMultiplier - это количество ожидающихся байтов байтов, ReadTotalTimeoutConstant - это некоторая добавка к времени отводимому на чтение всех байтов (про запас).
Но с этими таймаутами тоже не так просто получается. Кого интересует посмотрите мой вчерашний вопрос "Таймауты при чтении COM-порта" на этом форуме (до сих пор не отвеченный).
← →
erik (2002-03-19 14:32) [9]To EsKor
А ты используй OVERLAPPED-режим и никакие таймауты тебе непотребуются. Еще раз всем напопинаю ненадо самодеятельности, хороший драйвер для com порта вы напишите через 2 года работы. Я перебрал порядка 50 компонентов с исходными кода и писал свои. Но когда посмотрел на VARIAN ASYNC32 понял, что все написаное мною это ерунда.
Очень много людй прошли этот путь, неповторяйте чущие ошибки, используйте готовые решения! Могу прислать компонент желающим.
← →
Лёша (2002-03-19 16:33) [10]2 erik © (19.03.02 14:32)
Абсолютная правда.
Юзать компоненты, ДДК и всякие ядрённые агенты нужно в том случае, когда собираешся годами сидеть только на разработке драйверов.
Кстати, и о Делфи придётся забыть
← →
Master Denis (2002-03-28 14:33) [11]А я обычно использую библиотеку PComm от www.moxa.com (бесплатно) там когда читаешь порт, а буффер пуст функция выдает тебе -1 и не подвисает! Красота.
← →
gluka (2002-03-28 15:46) [12]А где бы его взять (VARIAN ASYNC32 COMPONENT)?!?!?!
Желательно под Д5 Д6!!!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.013 c