Работаю постоянно с COM-портами, опрос различных устройств, датчиков, контроллеров. Улучшит ли работу (скорость) использование для считывания-записи данных драйвера?
А для этого месяц разбирайся с ком-портом (драйвером)?*))) Было бы время, будет попробую. Я думал может кто делал и что получилось. Если получилось быстрее, тогда можно попробовать законно*))
Я могу кинуть сэмплы работы в асинхронном режиме с использованием апи. Кстати литературы море и она доступна =) ИМХО: начинать надо с простых вещей.
Спасибо! АПИ для меня освоенная тема в некотором роде. Я постоянно тестирую разные устройства по СОМ-порту (контроллеры), вот думал для этого может драйвер даст плюсы в работе. По портам лит-ры море, а вот по кернел драйверам портов не море, хотя что-то вроде видел в рекламе издательства БХВ из Питера, не читали?
donaire Скорость так сильно не увеличишь. (А выше скорости обмена и вовсе не увеличишь ИМХО драйвер стоит делать только если устройство как-то там нестандартно с портом работет.
donaire На некоторых ноутбуках нет вообще COM-портов, зато есть USB. Для подключения контроллеров и прочих COM-совместимых игрушек, приходится устанавливать переходники USB->COM или USB->LPT. Программирование такого псевдо-порта через API (CreateFile, ReadFile, WriteFile) зачастую работает, а через собственный драйвер - нет, т.к. порт на самом деле USB. Так что с точки зрения совместимости лучше API. И прав администратора не нужно для использования. С драйвером больше возни, нужны права админа, совместимость может страдать со всякими нестандартными портами и с разными версиями винды. Скорость, конечно, может немного возрасти, но стоит ли оно таких затрат?
Как раз для такого случая пишу программу, которая является переходником между DOS под VMWare и преобразователем USB-COM. Алгоритм простой: программа связана с VMWare через named pipe, и переправляет поток данных из pipe в COM, а также из COM в pipe. Поток, отвечающий за передачу из pipe в COM имеет примерно следующую последовательность действий: for (; { ReadFile (hPipe,buf,...,&ovr); waitfor (ovr.handle,INFINITE); GetOverlappedResult (...); WriteFile (hCOM,buf,..,&ovr1); } Вопрос в том, как оптимизировать этот поток. ReadFile всегда получает за раз только 1 байт. Скорость получения байта от pipe примерно в 3 раза выше, чем скорость COM-порта (такова особенность VMWare).
Из приведенного мною примера и так видно, что чтение и запись происходит асинхронно. Вопрос намного "тоньше": если я читаю и пишу по 1 байту, то это гораздо медленне, чем, если вычитать всю посылку из pipe, а затем передать на запись в виртуальный COM-порт. Какова оптимальная длина записи, для вывода в виртуальный COM-порт?
Если тебя не устраивает именно низкая скорость передачи данных (макс 115200 кБит/с), то тебе прямая дорога вот сюда: http://www.rippstein.net/HiSerialEN.htm Дело в том, что УАРТ на большинстве мамок апаратно позволяет иметь скорость вплоть до 921600 кБит/с и этот драйвер такую возможность открывает.
Ну, это один из вариантов... Хотелось бы все таки получить ответ на мой вопрос: какая длина записи оптимальна для вывода в виртуальный COM-порт?
Чем дольше, тем лучше, IMHO ReadFile всегда получает ровно столько, сколько есть в буфере порта (если твой буфер заведомо больше) Чесно говоря, не совсем понял зачем этот изврат нужен. С USB-шным СОМ портом тоже можно общатся теми же стандартными API. К тому же они как правило поддерживают бОльшую чем 115200 скорость без вмешательства всяких там HiSerial.sys
Дело в том, что все это нужно для работы с PC-совместимымми контроллерами, которые работают под DOS. Есть ПО, которое позволяет подключать контроллер, как диск через COM-порт, и это по работает под DOS. Также приходится использовать удаленную отладку с помощью turbo-debug 3.1 от Borland. Все это работает по DOS. А в качестве инструментальной машины нужно использовать Notebook, который без COM-порта...