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

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

Как правильно работать с COM портом через API? [D5, Win95/98, WinME, NT4, Win2k, WinXP]


JohnKorsh ©   (2003-03-31 12:10:00) 

Компилятор "не пропускает" API функцию
WaitCommEvent (hPort, EV_TXEMPTY, nil);
Указывает на EV_TXEMPTY и пишет, что Types of actual and formal var parametrs must be identical.
Все остальные функции API работают нормально.
Может кто подскажет ?
И ещё как грамотно очистить приёмный буфер COM?


JohnKorsh   (2003-04-01 13:29:00) [1]

К сожалению, под W95, W98 функция WaitCommEvent(hPort, Mask, nil); с маской EV_TXEMTY работает правильно, а под W_2K и W_XP у меня почему-то не ждёт и, при частом обращении теряет символы, но нашёл как работает, поэтому отвечаю сам себе, может кому и пригодится:

procedure TMy_Com.putb_ex(b : byte;
var res :boolean);
{ Send one byte. }

var
stat : dword;
i : integer;

begin

res := True;

stat := 0;
i := 0;
While ((stat <> 1) and
(i < 1000)) do
begin
WriteFile(com,
b,
1,
stat,
nil);
i := i + 1;
end;

{ Когда передача не удалась из-за, например полного аппаратного буфера, stat не равен 1, пытаемся ещё 1000 раз, с защитой от зависания.}

end;


крот   (2003-03-31 15:02:00) [2]


> pasha676 (31.03.03 14:29)
> Кстати Ovr - тоже переменная. Надо объявить и ее:
>
> Ovr : TOverlapped;
>
> Без нее не работает.


Работает и без нее. WaitCommEvent(hPort, Mask, nil);


pasha676   (2003-03-31 14:29:00) [3]

Кстати Ovr - тоже переменная. Надо объявить и ее:

Ovr : TOverlapped;

Без нее не работает.


pasha676   (2003-03-31 14:27:00) [4]

Я делаю примерно так

WaitCommEvent(port,Mask,@Ovr);
if (Mask and EV_TXEMTY)=EV_TXEMPTY then
begin
че надо
end;

Mask - DWord. Если внимательно почитать хелп по WaitCommEvent
то там имеем

LPDWORD lpEvtMask, // address of variable for event that occurred

Т.е. этот параметр не константа, а переменная.


крот   (2003-03-31 13:04:00) [5]

Вторым параметром в WaitCommEvent обязательно должна быть переменная типа cardinal, содержащая код ожидаемого события
(в твоем случае - EV_TXEMPTY). Для очитки приемного буффера, используй PurgeComm


Наверх

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