Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2022, 19:35   #1
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию И снова работа с COM портом

Всем доброго дня!
У меня проблема приема данных по СОМ порту. Данные выдаются пакетом из устройства в порт ПК каждые 100 мс размером 2500 байт. Но происходит потеря данных, вернее последовательность данных при чтении буфера порта нарушается, скажем так, последний принятый байт в пакете был с номером 2000, а при следующем чтении порта начинается не 2001, а ,например, 2020.
Настройка порта следующая:
8 бит;
Контроль четности - нет;
Число стоп бит - 1;
Скорость обмена -460480;
Таймауты по умолчанию, кроме MAXWORD все нули.
Размер буфера порта 4096, увеличивал до 15000.
В программе использовал библиотеку VaCOM, пробовал делать свой поток с функциями ReadFile, тут результат еще хуже, чтение производится, то 14000 байт, то 45 байт, что приводит к потере.
Чтение происходит по событию RXchar.
Хотелось бы узнать, реально читать данные при такой скорости и настройке без потерь или в Windows это дело гиблое? И есть ли еще инструменты читать данные без потерь?
arktik вне форума Ответить с цитированием
Старый 21.08.2022, 09:18   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

arktik, вычитывание то как производится ? Нужно вычитывать в отдельном потоке в бесконечном цикле. Складывать в свой программный буфер. Тогда всё реально

ну, и не забывать про межпоточную синхронизацию доступа к буферу
Алексей1153 на форуме Ответить с цитированием
Старый 21.08.2022, 11:17   #3
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Выкладываю код в потоке.

Код:
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(Buffer1),Temp,@OverRead);
           
           end;
        end;
      end;
    end;

Последний раз редактировалось arktik; 21.08.2022 в 11:29.
arktik вне форума Ответить с цитированием
Старый 21.08.2022, 11:23   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

arktik, не нужно никаких событий и overlapped. Просто в цикле пытаешься вычитывать, скажем, по 4096 байтов постоянно. ReadFile вернёт, сколько реально прочиталось. Всё прочитанное докидывай в свой программный буфер

а в другом потоке из буфера извлекаешь и анализируешь уже неспеша
Алексей1153 на форуме Ответить с цитированием
Старый 21.08.2022, 11:38   #5
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Я правильно понял, убрать в потоке все кроме:

Код:
  ClearCommError(FHandle,Temp,@ComStat);
         Btr:=ComStat.cbInQue;
          if Btr<>0 then
           begin
             ReadFile(FHandle,Buffer,SizeOf(Buffer),Temp,@OverRead);
             Synchronize(pser.VaCommRxChar);
           end;
причем SizeOf(Buffer) задать явно 4096.
arktik вне форума Ответить с цитированием
Старый 21.08.2022, 12:11   #6
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

ClearCommError - это вряд ли нужно постоянно вызывать. Только при возврате ошибки из ReadFile

4096 - имеется в виду число, равное или меньшее заданному для ком-порта буферу чтения
Алексей1153 на форуме Ответить с цитированием
Старый 21.08.2022, 12:15   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

------
ещё, наверное, будет полезно до чтения узнавать, сколько байтов имеется на чтение, чтобы указывать количество, меньшее или равное реальному входящему количеству. Таким образом не будет задержек из-за таймаута ожидания байта ком-порта, когда новых данных ещё нет, а запрошено много
(но как это узнаЁтся - я уже не помню)

или просто выставить этот таймаут в 0
Алексей1153 на форуме Ответить с цитированием
Старый 21.08.2022, 12:23   #8
arktik
Пользователь
 
Регистрация: 30.07.2022
Сообщений: 12
По умолчанию

Спасибо, большое за советы, обязательно ими воспользуюсь.
arktik вне форума Ответить с цитированием
Старый 18.10.2022, 00:13   #9
ZaslaneC
Новичок
Джуниор
 
Регистрация: 17.10.2022
Сообщений: 9
По умолчанию работа с СОМ портом

Всем доброго времени суток.
Я новичок в программировании)))
Пишу оконное приложение, которое работает с MEGA32. Посылаю железке запросы, она мне присылает ответы.
Проблема вот в чём - у меня стоит Windows 7 и я могу связаться с устройством, а разработчик устройства (у него Windows 10) не может. Подскажите пожалуйста в какую сторону копать.
И ещё одна проблемка - это СОМ порт выше 9. Я нашёл как отображать сом10 и выше,но они не подключаются.
код если нужно приложу!!!
ZaslaneC вне форума Ответить с цитированием
Старый 18.10.2022, 00:21   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 951
По умолчанию

Цитата:
Сообщение от ZaslaneC Посмотреть сообщение
Подскажите пожалуйста в какую сторону копать.
вывести в лог GetLastError() и другие ошибки после вызовов АПИ функций
Алексей1153 на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с Com - портом Dmitry_B Visual C++ 16 25.11.2016 18:14
Работа с PCI портом Volodya199 Общие вопросы C/C++ 1 14.12.2010 20:17
Работа с СОМ портом Ivanko Общие вопросы Delphi 2 16.02.2010 10:58
Работа с COM портом hoba Общие вопросы Delphi 3 20.11.2008 03:39