Всем доброго дня!
У меня проблема приема данных по СОМ порту. Данные выдаются пакетом из устройства в порт ПК каждые 100 мс размером 2500 байт. Но происходит потеря данных, вернее последовательность данных при чтении буфера порта нарушается, скажем так, последний принятый байт в пакете был с номером 2000, а при следующем чтении порта начинается не 2001, а ,например, 2020.
Настройка порта следующая:
8 бит;
Контроль четности - нет;
Число стоп бит - 1;
Скорость обмена -460480;
Таймауты по умолчанию, кроме MAXWORD все нули.
Размер буфера порта 4096, увеличивал до 15000.
В программе использовал библиотеку VaCOM, пробовал делать свой поток с функциями ReadFile, тут результат еще хуже, чтение производится, то 14000 байт, то 45 байт, что приводит к потере.
Чтение происходит по событию RXchar.
Хотелось бы узнать, реально читать данные при такой скорости и настройке без потерь или в Windows это дело гиблое? И есть ли еще инструменты читать данные без потерь?
Код в потоке:
Код:
procedure MyThread.execute;
var S: string; i:integer;
begin
//inherited;
OverRead.hEvent:=CreateEvent(nil,True,True,nil);
while not MyThr.Terminated do
begin
WaitCommEvent(FHandle,Mask,@OverRead);
signal:=WaitForSingleObject(OverRead.hEvent,infinite);
if(signal=Wait_Object_0) then
begin
if GetOverlappedResult(FHandle,OverRead,Temp,true) then
begin
if((Mask and EV_RXchar)<>0) then
begin
ClearCommError(FHandle,Temp,@ComStat);
Btr:=ComStat.cbInQue;
if Btr<>0 then
begin
ReadFile(FHandle,Buffer,SizeOf(Buffer),Temp,@OverRead);
end;
end;
end;
end;