|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Работа с COM портом
Всем доброго дня!
У меня проблема приема данных по СОМ порту. Данные выдаются пакетом из устройства в порт ПК каждые 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; |