Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

Пропуски данных при приёме по Com порту компонент CPort   Найти похожие ветки 

 
MegaVolt ©   (2007-03-17 15:51) [0]

Подскажите кто работал с этим компонентом как убрать пропуски данных?

Есть подозрение что проблема в неиспользовании буфера так как OnRxBuf вызывается с количеством данных в буфере 8 байт. Изредка 16.

Пробовал увеличивать приоритет мониторящего потока, пробовал менять метод синхронизации.

Обработчик OnRxBuf работает только с данными без обращения к VCL занимает очень мало времени (практически только контроль количества переданных байт)

Что можно сделать чтобы компонент работал нормально?

Как вариант как сделать так чтобы он принимал не по 8 байт а целыми буферами.


 
S@shka ©   (2007-03-17 22:50) [1]

Вариант написать работу с Com-портом самому с помощью WinAPI
Поищи - неоднократно здесь тема поднималась/

+ http://delphimaster.ru/articles/comport2/index.html


 
Германн ©   (2007-03-18 02:05) [2]


> S@shka ©   (17.03.07 22:50) [1]
>
> Вариант написать работу с Com-портом самому с помощью WinAPI
> Поищи - неоднократно здесь тема поднималась/

Поднималась, но грамотного решения ни разу не было.

> MegaVolt ©   (17.03.07 15:51)

Я не знаю этот конкретно компонент, но видел многие другие. Вообще в сабже очень мало конкретной информации. Что есть "пропуски информации"?
В целом у меня сложилось мнение, что ты неправильно понимаешь суть события OnRxBuf. Как правило, события OnRxXXXX всевозможных сомпонент, позволяют прочитать в прикладную программу из буфера СОМ-порта очередную порцию принятой им информации. Т.е. в прикладной программе следует создать свой буфер, в котором собирается набор байт полученных в событиях OnRxXXXX. А уж анализ того факта, что "принято всё или не всё" делать на основе данных в буфере самой программы.


 
MegaVolt ©   (2007-03-19 10:47) [3]

>Вариант написать работу с Com-портом самому с помощью WinAPI

Для этого у меня не хватет знаний принципов внутренней организации СОМ порта :( (Как работает сама микруха представляю прекрасно)

>Вообще в сабже очень мало конкретной информации.
Спроси что нужно уточнить?

>Что есть "пропуски информации"?
Пропуски означают что если во время приёма пол мегабайта информации начать активно юзать комп то доходит не вся информация. В часности например запуск просмотра видео. Если же не трогать комп то данные доезжают все без проблем.

Где то в инете втретил мысль про то что приоритет у веника выше чем у ком порта и поэтому так и происходит. Может ли кто то это подтвердить? Вариантом борьбы с этим была предложено отключать в биосе пакетное чтение с веника. Но как то мне этот вариант не близок :(


 
S@shka ©   (2007-03-19 11:13) [4]


> Поднималась, но грамотного решения ни разу не было.


Интересно это что значит?

А граматное решение работы с работы с текстовыми файлами было?

Нет смысла работать с CPort - все элементарно пишется на API.
(Уж тем более если возникают проблемы - в виде как считает аффтар неадекватности его работы)

http://delphimaster.net/view/6-1173167422/


 
Evgeny V ©   (2007-03-19 11:23) [5]


> MegaVolt ©   (17.03.07 15:51)


Библиотека хорошая, в свое время использовал, правда давно очень...
  При сильной загрузке компа, высокой скорости передачи возможна потеря данных. Используй аппаратный контроль за потоком данных, если у тебя это не используется...  в этом случае потерь не будет. Принимать целым буфером.... это ты сам должен отслеживать и собирать в пакеты (хотя насколько помнится в библиотеки был компанент уже делающий это, обеспечивающий пакетную передачу  и прием данных типа TComDataPacket)


 
MegaVolt ©   (2007-03-19 12:05) [6]

>Используй аппаратный контроль за потоком данных, если у тебя это не используется...  в этом случае потерь не будет.

Это понятно. Но линий всего две Tx и Rx так что исспользование CTS RTS отпадает. Поток непрерывный.

>Нет смысла работать с CPort - все элементарно пишется на API.

Если я не могу нормально запустить отлаженный компонент со всеми исходниками что изменится если я напишу сам этот компонент?


 
S@shka ©   (2007-03-19 12:14) [7]

Цитирую [1]


> Что можно сделать чтобы компонент работал нормально?



> Если я не могу нормально запустить отлаженный компонент


Вот в том то и дело, что сказать со 100% уверенности об отлаженности работы компонента написанного не тобой к сож. нельзя.

-- Поgробуй приоретет поднять у своего приложения (потока CPort) до tpHigher


 
MegaVolt ©   (2007-03-19 12:21) [8]

>Вот в том то и дело, что сказать со 100% уверенности об отлаженности работы компонента написанного не тобой к сож. нельзя.

Согласен. Но вроде там всё прозрачно. Если бы мне хватило уровня написать своё то и там бы я нашел ошибку. Опять же проблема не в его работе а в его работе при загрузке машины другими задачами.

>Поgробуй приоретет поднять у своего приложения (потока CPort) до tpHigher

Сделано. Польза есть но всё равно есть пропуски.


 
Evgeny V ©   (2007-03-19 12:33) [9]


> MegaVolt ©   (19.03.07 12:21) [8]

Приоритеты не панацея. Если не можешь использовать аппаратный или программный контроль потоком данных, то надо вынести задачу приема и обработки данных на отдельное устройство с приличным буфером, которое только этим и будет заниматься - прием и обработка потока данных и выдача результатов на компьютер пользователя. Там и выдачу результата ты уже можешь реализовать, используя контроль потоков. В качестве отдельного устройства можно использовать и устройство на основе PIC или других однокристалок или микроконтроллеров, или одноплатные компьютеры, бисквит PC.... не так важно. Важно иметь независимое буферное устройство, которое успевало бы принимать и обрабатывать данные.
PS: Кстати библиотека CPort на самом деле весьма качественная, в свое время смотрел исходные коды, многое для себя подглядел...


 
MegaVolt ©   (2007-03-19 13:28) [10]

>Важно иметь независимое буферное устройство, которое успевало бы принимать и обрабатывать данные.

Это понятно. Связь итак идёт от однокристалки. Ставить ещё одну для буферизации изврат :) Проще протокол наваять с подтверждениями.

Хотя я думал что винда вполне с этим может справится :( Тем более что исспользуя SetupComm можно выставить порту размер буфера. Я так понимаю это как раз и есть буфер уровня драйвера. Или я ошибаюсь?


 
Evgeny V ©   (2007-03-19 14:02) [11]


> MegaVolt ©   (19.03.07 13:28) [10]

Если своя однокристалка, то делайте аппаратный или програмный контроль управлением потока, тогда проблемы должны уйти.  Про буфе и драйвер - да... Но такой параметр есть у тебя в TComPort, так что мучать SetupComm, если ты работаешь чеоез компонент нет смысла


 
orinoko   (2007-03-19 14:19) [12]

я одно время использовал CPort. В общем он неплох и очень быстро работает. НО... сабж является одним из минусов. У него проблема в том что это проявляется когда в буфере накапливается больше примерно 400 байт, что при большой загрузке компа вполне реально. Не лечится. Можно попробовать уменьшить количество разрешённых Events (оставить только evRxChar и evRxFlag) и изменить SyncMethod на smWindowSync. Возможно этого хватит. Если нет - использовать другой компонент. Что я и сделал в последствии.
И вернулся на старый проверенный компонент TCommPortDriver (by Marco Cocco).


 
MegaVolt ©   (2007-03-19 14:22) [13]

>Про буфе и драйвер - да...
Если я прав то почеу мне данные приходят размером по 8 байтиков? Или буфер исспользуется только тогда когда я данные не могу забрать?

>Но такой параметр есть у тебя в TComPort, так что мучать SetupComm, если ты работаешь чеоез компонент нет смысла
Само собой :) Я просто в исходниках глянул что они используют.

В каких случаях я могу терять данные?
Я вижу пока несколько:
1. Драйвер не успевает складывать данные в собственный програмный буфер. (Как это проверить я не знаю)
2. Прога не успевает обрабатывать данные до переполнение буфера.
(вроде тогда должен быть флаг ошибки а его нет)
3. Ещё что то?


 
MegaVolt ©   (2007-03-19 14:31) [14]

>У него проблема в том что это проявляется когда в буфере накапливается больше примерно 400 байт, что при большой загрузке компа вполне реально. Не лечится.

Странно а что же в нём такого особенного чем он отличается от других?

>изменить SyncMethod на smWindowSync

Я сейчас работаю с SyncMethod:=smNone т.е. принимаю данные в процедуре относящейся к самому мониторящему потоку. По наблюдениям это даёт самый минимальный уровень потерь.


 
Evgeny V ©   (2007-03-19 14:38) [15]


> MegaVolt ©   (19.03.07 14:22) [13]


Терять данные можно по разным причинам, наиболее вероятная мне кажется причина 1- UART  выставил прерывание, что есть в буфере UART символ(ы) (буфер самого UART-a, а он небольшй, дай бог памяти 8 или 16, но могу соврать... в любом случае небольшой), но кмопьютер будучи сильно занят неуспел обработать прерывание и считать символы из буфера, а пришли новые.... при этом возникает ошибка, прием прекращается до обработки ошибки, данные теряются... А проверить - надо отслеживать и анализировать ошибки возникшие на порту.
 Вариант два возможен, когда большие скорости передачи, комп нагружен нууу очччень сильно а буфер мал, а посылки данных большие, постоянно идет информация... и ты сильно много времени висишь в обработчике буфера, тормозя тем самым начало нового цикла чтения.... Но тоже как вариант возможно... наверное.  Опять таки отслеживать и анализировать ошибки порта...  Получишь ответ в виде кода ошибки.


 
MegaVolt ©   (2007-03-19 15:14) [16]

>наиболее вероятная мне кажется причина: буфер самого UART-a, небольшй а компьютер будучи сильно занят неуспел обработать прерывание и считать символы из буфера, а пришли новые....
Ага Я так и думаю. Но получается что проблема в драйвере Com порта и решить эту проблему програмно неполучится. Кроме как организации квитирования програмного или аппаратного.

Ошибки попробую ловить :) Только найду нульмодемный кабель.



Страницы: 1 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
4-1174545538
Сканер
2007-03-22 09:38
2007.09.09
Чтение COM port под XP


2-1187180620
r.o.o.t
2007-08-15 16:23
2007.09.09
Передача параметров..


15-1187106129
iZEN
2007-08-14 19:42
2007.09.09
Mdf2iso, есть ли аналоги iat.exe?


15-1186674765
@!!ex
2007-08-09 19:52
2007.09.09
Как убрать звук?


15-1187075975
Vlad Oshin
2007-08-14 11:19
2007.09.09
Хочу быть директором :)