WWX
Постоялец
Offline
|
|
« : 28-01-2021 14:43 » |
|
Доброго времени суток.
Есть устройство, работающее через USB. При подключении к хосту видится как виртуальный COM-порт.
Запись данных производится ф-цией "WriteFile". Запись данных размером до 4 МБ происходит без ошибок.
При попытке записать большее количество данных (за один вызов "WriteFile") на некоторых ПК возникает ошибка: 87 (ERROR_INVALID_PARAMETER). А на остальных ПК удаётся записать (за один вызов "WriteFile") до 512 МБ (больше пытаться записывать не имеет смысла).
Т. е. на двух ПК с Windows 7 ошибка стабильно проявляется (ни разу не записалось больше 4 МБ за один вызов). На двух других ПК с мультизагрузкой: На Windows 7 нет ошибок (записывается до 512 МБ); На Windows 10 ошибка стабильно проявляется (ни разу не записалось больше 4 МБ за один вызов).
В чём может быть причина ошибки?
(Каких-либо специальных настроек COM-порта после открытия ф-цией "CreateFile" не делаю, но обе структуры "DCB" и "COMMPROP" абсолютно одинаковы как на ПК на котором всё работает, так и на ПК, на котором большие размеры данных не передаются.)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 29-01-2021 04:44 » |
|
WWX, нужно пытаться записывать мЕньшими кусками (скажем, по 4кб). При возникновении ошибки, думаю, нужно чуть выждать (1 мс ?) и снова повторить отправку пакета, то есть не прерывать общий прогресс
|
|
|
Записан
|
|
|
|
WWX
Постоялец
Offline
|
|
« Ответ #2 : 29-01-2021 07:47 » |
|
Спасибо за ответ.
Похоже, что так и придётся делать, но меня смущает тот факт, что это проявляется не на всех ПК. (И даже на одном ПК может проявляться в зависимости от ОС (Windows 7 или Windows 10).)
И выглядит это так, что ОС сама (по каким-то ведомым ей одной причинам) кочевряжится отправлять более 4 МБ за один вызов "WriteFile". Аппаратура тут вроде бы не при чём. Возможно где-то в реестре (или ещё где) есть соответствующая настройка, но это только предположение. Если бы где-то в документации что-то было бы сказано по этому поводу... но найти что-то не получилось.
("ReadFile" при этом нормально считывает размеры до 512 МБ (на всех подопытных ПК).)
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #3 : 29-01-2021 09:11 » |
|
Возможно драйвера этого самого виртуального COM-порта разные. Плюс, сам стек USB скорее всего разный в Windows 7 и Windows 10.
|
|
|
Записан
|
|
|
|
WWX
Постоялец
Offline
|
|
« Ответ #4 : 29-01-2021 11:48 » |
|
На самом деле на всех подопытных Windows 7 драйвера (usbser.sys) одинаковые на бинарном уровне. Версии в диспетчере устройств тоже одинаковые (иначе, впрочем, и быть не могло). Не совсем понятно, при чём здесь USB стек. Смотрел шину USB-анализатором - в случае ошибки 87 (ERROR_INVALID_PARAMETER) на шине ничего не происходит, система даже не пытается ничего передавать в устройство.
|
|
|
Записан
|
|
|
|
darkelf
Молодой специалист
Offline
|
|
« Ответ #5 : 29-01-2021 11:54 » |
|
Возможно я Вас неправильно понял. Я так понял, что в Windows 7 работает, в Windows 10 - нет. Думаю, что в Windows 7 и Windows 10 разные и стеки USB (программные), и, возможно разные драйвера. И кто-то из них анализирует размер выдаваемых данных и даёт указанную Вами ошибку.
|
|
|
Записан
|
|
|
|
WWX
Постоялец
Offline
|
|
« Ответ #6 : 29-01-2021 12:54 » |
|
Не совсем так.
На некоторых Windows 7 работает, на некоторых - нет (ошибка 87 (ERROR_INVALID_PARAMETER)). (При этом драйверы у них одинаковые.) На всех Windows 10, на которых проверял (на текущий момент их целых три штуки) - не работает (та же самая ошибка).
|
|
|
Записан
|
|
|
|
|