Цитата
while (1)
{
ReadFile(handler,buffer[0],255,tail,nil);
if (tail>=14) then
begin
//тут обработчик вашего события.
end;
}
Так выглядит решение вашей задачи с использованием WinAPI.
Рекомендую выбросить на помойку компонент. Ибо вы все равно не пользуетесь возможностями объектно-ориентированного программирования. А используете данный объект просто как библиотеку.
Открытие компорта чуть сложнее.
Код
CommTimeOuts:_CommTimeOuts;
DCB:_DCB;
Procedure OpenPort(s:string);
var c:dword;
begin
r_head:=0;r_tail:=0;r_point:=0;r_inv:=0;r_state:=0;
if (hand>0) and (hand<>$FFFFFFFFF) then ClosePort;
c:=CreateFile(PAnsiChar('\\.\'+s),GENERIC_READ or GENERIC_WRITE,0,
nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
if (c=$FFFFFFFF) then c:=0;
CommTimeOuts.ReadIntervalTimeout:= $FFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier:= 0;
CommTimeOuts.ReadTotalTimeoutConstant:= 0;
CommTimeOuts.WriteTotalTimeoutMultiplier:= 0;
CommTimeOuts.WriteTotalTimeoutConstant:= 1500;
if (c>0) then
SetCommTimeouts(c, CommTimeOuts);
if (c>0) then begin
getcommstate(c,dcb);
//DCB.DCBlength:=0;
DCB.BaudRate:=115200;//256000;
DCB.Flags:=$1001;
//DCB.XonLim:=0;
//DCB.XoffLim:=0;
DCB.ByteSize:=8;
DCB.Parity:=0;
DCB.StopBits:=0;
//BuildCommDCB('256000,N,8,1',DCB);
SetCommState(c, DCB);
EscapeCommFunction(c,CLRRTS);
EscapeCommFunction(c,CLRDTR);
end;
w_head:=0;w_tail:=0;
hand:=c;
end;
Ну а дальше, все, что требуется, запустить отдельный поток с "while(1)...".
Таким образом в буфере вы всегда будете иметь принятые данные. Вся информация о текущем количестве у вас будет.
Для счастья больше ничего не требуется.
И все это занимает 50 строк на паскале.