Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.08.2022, 11:50
arktik arktik вне форума
Прохожий
 
Регистрация: 30.07.2022
Сообщения: 5
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Работа с 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;
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:01.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter   Ссылка на Telegram