Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Ускорить работу виртуального COM порта


Автор: semibug 20.9.2010, 16:26
Суть такова. Custom USB-устройство определяется как последовательный порт через стандартный виндовый драйвер. На устройство постоянно подается поток данных. Сейчас прокачивается примерно около 150 килобайт в секунду, что ниже пропускной способности USB шины.
В какую сторону покапать, что бы добиться более высокой скорости?

Автор: GremlinProg 21.9.2010, 08:30
Цитата(semibug @  20.9.2010,  18:26 Найти цитируемый пост)
В какую сторону покапать, что бы добиться более высокой скорости?

зайти на сайт производителя, поискать дрова на свою модель

если скорость осталась прежней, значит скорее всего устройство просто не может изрыгать данные быстрее вследствии каких-то причин, не зависящих транспорта, например: сложность алгоритмов их расчета, медленный вычислитель, неоптимальные алгоритмы и т.п.

тогда тут максимум что можно сделать:
 - обновить по возможности прошивку устройства
 - взять другую модель

Автор: semibug 21.9.2010, 08:41
GremlinProg, производитель рекомендует стандартный виндовый драйвер usbser.sys.
Само устройство может работать быстрее, т.к. я пробовал написать под него прошивку с транспортом по bulk на 64 байта и драйвер под windows. Результаты - около 800 кб/с. Но это требует перепрошивки устройства, что не совсем удобно (стоит цель работать сразу с устройствами из коробки без обновления Firmware). Т.е. похоже, что железка теоретически может глотать данные, но винда не хочет засылать большое кол-во данных в последовательный порт.

Автор: icecrashldr 21.9.2010, 17:26
Какая функция используется для отсылки данных\приема?
ReadFile\ReadFileEx
WriteFile\WriteFileEx
?

Последний раз несколько месяцев писал USB network скорость была свыше 100 мбит\с
Может стоит USB hub поменять?

Автор: semibug 21.9.2010, 17:30
icecrashldr, последовательный порт открываю через CreateFile( "\\.\COM1" ), пишу с помощью WriteFile.
Скорости 100 мб/с в моем случае не достичь, т.к. железка не работает на HighSpeed.


Автор: icecrashldr 21.9.2010, 18:03
HighSpeed - это не очень хорошо...


WriteFile заменить на WriteFileEx c APC .

Псевдо

Код

void FuncSenderByComPort()
{
     HANDLE hWaitEvents[] = {hEventStop, hComPort};
     OVERLAPPED overlapped; // надо установить callback.
     do
    { 
           // Здесь получаем сообщения из очереди, думаю как организовать очередь справитесь.
           WriteFileEx(hComPort, , , , , overlapped);
           WaitForMultipleObjectsEx(2, hWaitEvents, FALSE, INFINITE, TRUE); // WAIT_OBJECT_0 будет сигнализировать о выходе, WAIT_OBJECT_1 о заверщении записи.
     }while(true)
}


Почему?

Об реализации в недрах винды

WriteFile - не оптимально
         Формирует запрос к драйверу
         Отсылка запрос + ожидания ответа.
                     DRIVER
                            Отсылает данные на устройство
                             Ждем окончания
                             говорит на USER level запись завершена.
         Получили ответ, удаляет временные переменные, и выход из функции.
              
WriteFileEx - оптимально
                 Формирует запрос к драйверу 
                 Отсылка запрос. 
                 Выход из функции для посылки следующих пакетов, но в это время драйвер уже отсылает данные на устройство.
                 После того как мы послали N количество запросов, наконец токи в ответ мы получаем информацию о завершении посылки данных.
                 Получим инфу в колбеки.

Вообще детальней сейчас отписать не могу, так как на работе. smile
 
              





Автор: semibug 22.9.2010, 18:42
icecrashldr, спасибо. Попытаюсь писать через WriteFileEx.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)