Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
3-77294
oss
2002-05-29 11:31
2002.06.24
Invalid Field value


4-77693
AndreyS
2002-04-27 13:09
2002.06.24
Вопрос новичка


1-77473
Sniffer
2002-06-11 19:29
2002.06.24
Чёртик, бегающий по экрану


1-77364
Reticent
2002-06-13 12:47
2002.06.24
мааааленький вопросик про память


7-77637
UnDISCOvery
2002-03-12 15:50
2002.06.24
Как программно изменить состояние флага





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