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

Вниз

Общий вопрос по RS232   Найти похожие ветки 

 
Still Swamp   (2003-05-13 14:28) [0]

Как происходит чтение из порта?

Устройство с другой стороны посылает значение. Предположим порт уже открыт, но чтение я не осуществляю, те ReadFile не выполняется. Буферизируются ли входящие байты со стороны компьютера? Если да то где, и на сколько долго, и в каком количестве?


 
MBo   (2003-05-13 14:32) [1]

На сайте есть три статьи по работе с компортом


 
Still Swamp   (2003-05-13 15:38) [2]

на сайте я нашел две, но на этот вопрос ни та ни другая не отвечает.


 
N172   (2003-05-13 16:37) [3]

Буферирует. Как именно - нас не касается.
Но мы должны знать, что есть аппаратное fifo (15 байт, если не вру), и есть специальный кэш в драйвере.
Поэтому девайс может посылать одиночными символами, а мы потом читаем группой.

Попробуйте-таки работать без overlapped и с нулевым временем ожидания.
В этом случае, если буфер пуст, ReadFile() возвратит количество прочитанных байт =0 и не будет выставлен какой-либо код ошибки.
Если данные есть, ReadFile() прочитает содержимое внутреннего буфера COM порта и возвратит пакет максимальной длины, который может разместиться в промежуточном буфере, переданном ReadFile() при вызове.
Разумеется, IMHO.


 
Still Swamp   (2003-05-14 10:19) [4]

если делаю без overlapped то на первом же read write трэды чтения и записи виснут на глухо. проверил - дреды корркктные, из них обращения к vcl и к прочим опасностям нет. виснет именно на строке чтения и записи.


 
N172   (2003-05-14 10:25) [5]

Надо было выставить нулевое время ожидания с помощью SetCommTimeouts(), тогда ReadFile() будет возвращаться сразу.

Если у вас 2 потока - один на чтение, другой на запись, то это не слишком удобно, т.к. если операция чтения не была завершена (поток 1), то порт остаётся залоченным до её завершения и, соответственно, операция записи (поток 2) будет поставлена в очередь и будет ожидать завершения операции чтения.


 
Verg   (2003-05-14 10:29) [6]


> В этом случае, если буфер пуст, ReadFile() возвратит количество
> прочитанных байт =0 и не будет выставлен какой-либо код
> ошибки.


ERROR_IO_PENDING


 
N172   (2003-05-14 10:45) [7]

Сдаюсь!


 
Still Swamp   (2003-05-14 10:50) [8]

:)
хорошо - хорошо, ну а мне то посоветуете далее с оверлапедом разбиратся, или без него?


 
N172   (2003-05-14 11:03) [9]

Я бы лично постарался сделать без overlapped но это как больше нравится. В том смысле, если есть отдельный поток, то overlapped, в принципе, не нужен.


 
Still Swamp   (2003-05-14 11:26) [10]

Хорошо, я всетаки попробую и так и эдак. начну с overlapped.

если мне необходимо событие на пришедший любой байт я делаю при инициализации
SetCommMask(FPortHandle, EV_RXCHAR);

затем читающем трэде
WaitCommEvent(Port.FPortHandle, WaitResult, @FOverlapped);
if (WaitResult and EV_RXCHAR)=EV_RXCHAR then begin....

Это так? Проблема, что он у меня на Wait вообще не задерживается.


 
Still Swamp   (2003-05-14 11:35) [11]

Короче
Заработало!

В хэлпе нашел что имя порта надо указывать как PortName:="\\.\COM1", а не "COM1" кто нить по может рассказать что это значит?


 
pasha676   (2003-05-14 15:08) [12]


> В хэлпе нашел что имя порта надо указывать как PortName:="\\.\COM1",
> а не "COM1"


Чушь какая то. Всегда указывал нормально и все работало. Ошибка была не в этом. Хотя я никогда не работал под NT, мож под NT такой заезд? Впрочем сомневаюсь.
Если на wait не задерживается, значит сообытие не сбрасывается и ты пытаешься читать по прежнему событию.
Наверное перед wait не обнулил маску
(WaitCommEvent(Port.FPortHandle, WaitResult, @FOverlapped);
, перед этим waitresult:=0, все это в цикле ессесно) или после распознавания прихода символа if (WaitResult and EV_RXCHAR)=EV_RXCHAR then begin.... не сбросил порт ClearCommError.


 
Still Swamp   (2003-05-16 10:20) [13]

да нет - четкий стабильный эффект.
как только убираю эту фразу - работать перестает. вертаю назад - все чудно работает. более естественно ничего не меняю.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.008 c
8-78001
Neznaika
2003-03-30 15:04
2003.07.24
мультимедиа


14-78116
Антонио
2003-07-08 15:56
2003.07.24
Ну народ, помогите, плиззз! Кто-нибудь знает, где найти компонент


3-77782
Жук
2003-07-02 11:50
2003.07.24
Запрос и его план


4-78196
Игорь200305
2003-05-21 10:01
2003.07.24
Как передать адрес строки в SendMessage?


3-77755
Vovik
2003-07-01 15:43
2003.07.24
Уважаемые Мастера. Почему не создается ADOQuery?





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