![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно работать с 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