Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как надежно принимать пакеты из устройства?
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
jur
Здравствуйте!

Мое устройство выдает 512-байтные пакеты данных в шину USB в строгой последовательности. Шина нагружена совсем не много: пакет передается порядка 42 микросекунд, пауза между передачами - 80 микросекунд и более. Работы произвожу на PC с пентиумом 4, система WinXP.

Воспользовавшись примерами из USB Developer's uStudio, я набросал тестовое приложение, которое просто принимает пакеты из шины. Прием производится порциями (блоками) по 8 (пробовал 16) пакетов, т.е. 4-8 кбайт. Все прекрасно принимается до тех пор, пока Windows не залепит паузу. В результате получается, что время от времени один-два пакета выпадает.

Попробовал принимать по одному пакету - вообще кошмар, пропадает порядка половины пакетов (чуть меньше). Пропадание сильно уменьшается начиная с величины буфера приема порядка 2 кбайт.

Подскажите, пожалуйста, как лучше написать программу приема пакетов из шины USB, чтобы не было их пропадания? Мне никак нельзя терять пакеты. Все они гарантированно должны быть приняты.

Особенность моего железа такова, что я не могу буферировать пакеты на передающей стороне, они выдаются автоматом, беспрерывно. Поэтому приемная сторона должна гарантированно принимать переданные устройством пакеты.

Спасибо!
Виктория
Цитата(jur @ Nov 3 2005, 09:17)
...
Подскажите, пожалуйста, как лучше написать программу приема пакетов из шины USB, чтобы не было их пропадания? Мне никак нельзя терять пакеты. Все они гарантированно должны быть приняты.
...
*


Что же Вы здесь спрашиваете, когда Вам могут быстрее и профессиональней помочь в разделе форума "Операционные системы" (замечено, что некоторые участники из этого раздела в другие разделы никогда и не заходят).

Цитата
Особенность моего железа такова, что я не могу буферировать пакеты на передающей стороне, они выдаются автоматом, беспрерывно. Поэтому приемная сторона должна гарантированно принимать переданные устройством пакеты.


А на приемной стороне буферизировать тоже невозможно? (типа - непрерывный прием с использованием низкоуровневых системных функций)
jur
Цитата(Vic1 @ Nov 3 2005, 14:01)
Что же Вы здесь спрашиваете, когда Вам могут быстрее и профессиональней помочь в разделе форума "Операционные системы" (замечено, что некоторые участники из этого раздела в другие разделы никогда и не заходят).
По двум причинам. Во-первых, мне нужно, чтобы мое устройство работало не с кем-либо, а именно с Windows XP. Поэтому общие рассуждения подобных форумов на тему: "Да поставь ты ОС РВ и не мучайся!", мне не подходят. А во-вторых, давно замечено, что профессионалы-практики дадут фору любому теоретику-системщику при решении конкретной задачи :-) Например, задачи освоения шины USB. Посему именно к профессионалам-практикам я и обратился :-)

Цитата(Vic1 @ Nov 3 2005, 14:01)
А на приемной стороне буферизировать тоже невозможно? (типа - непрерывный прием с использованием низкоуровневых системных функций)
На приемной стороне я как раз и буферирую. И очень даже с большим запасом (8, 16 пакетов и более). Тем не менее имею изредка пропуск единичных пакетов.

Однако, я немножко продвинулся в данном вопросе. Для этого я тщательно причесал пример "Streamer" из USB Developer's uStudio. Этот пример использует технику OVERLAPPED I/O, про все функции которого фирма Cypress не ленится десяток раз в разных местах мануала написать:

Цитата
You will usually want to use the synchronous XferData method rather than the asynchronous BeginDataXfer/WaitForXfer/FinishDataXfer approach.
Тем не менее я не послушался их мудрого совета и применил этот подход. Прием данных стал уверенным! Да еще я присвоил считывающему треду приоритет THREAD_PRIORITY_TIME_CRITICAL. Еще немножко погоняю приложение, посмотрю, на самом-ли деле проблема исчезла.
jur
Цитата
Еще немножко погоняю приложение, посмотрю, на самом-ли деле проблема исчезла.
Погонял. Причем в ужасных условиях. Забил процессор так, что даже Таск Менеджер по Ctrl-Alt-Del выскакивает только через 15-20 секунд :-) И ничего, ни одного сбоя. Хороший метод BeginDataXfer/WaitForXfer/FinishDataXfer! :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.