bvn123
Jan 25 2008, 10:41
Здравствуйте,
при изготовлении устройств с использованием USB-UART мостов под каждое устройство с уникальным VID и PID WinXP создает виртуальный COM-порт с уникальным номером.
По какой причине порты выше COM9 не открываются?
Как преодолеть?
Проверку выполнял как с использованием функций Windows API, так и компонента VarianAsync32, у которого, согласно документации, есть собственное ограничение (до COM16) .
В реестре при подключении очередных устр-в прописываются, например, COM10 или COM11, в диспетчере устройств порты COM10 и COM11 также автоматически появляются
Моя программа в Дельфи обнаруживает и распознает COM10, 11, но открытие порта с номером >9 вызывает ошибку:
PortNumber:=10;
hCOM:=CreateFile(
PChar('COM'+inttostr(PortNumber)),
GENERIC_READ + GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
// если PortNumber меньше 10-ти - работает, если >=10, hCOM=INVALID_HANDLE_VALUE
Сергей Борщ
Jan 25 2008, 11:41
sprintf(comPortName, "\\\\.\\COM%d", comPortNumber);
или в вашем случае PChar('\\\\.\\COM'+inttostr(PortNumber)),
vvs157
Jan 25 2008, 11:50
Цитата(bvn123 @ Jan 25 2008, 13:41)

Здравствуйте,
при изготовлении устройств с использованием USB-UART мостов под каждое устройство с уникальным VID и PID WinXP создает виртуальный COM-порт с уникальным номером.
По какой причине порты выше COM9 не открываются?
Как преодолеть?
У Вас какой-то глюк в системе. В ХР нет никаких проблем с СОМпортами болне 9-го. Любой номер до 255 открывается без проблем.
Сергей Борщ
Jan 25 2008, 14:16
Цитата(vvs157 @ Jan 25 2008, 13:50)

У Вас какой-то глюк в системе.
Глюка в системе нет. Просто имя порта для CreateFile надо указывать правильно. Вот:
http://support.microsoft.com/kb/115831
bvn123
Jan 25 2008, 14:58
Цитата(Сергей Борщ @ Jan 25 2008, 18:16)

Глюка в системе нет. Просто имя порта для CreateFile надо указывать правильно. Вот:
http://support.microsoft.com/kb/115831Спасибо, Сергей, ссылка помогла, заработало в таком виде:
hCOM:=CreateFile(
PChar('\\.\COM'+inttostr(PortNumber)),
GENERIC_READ + GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
При 'большем кол-ве слэшей (если копировать из статьи по ссылке \\\\.\\COM10) не работало
Очевидно и в компоненте VarianAsync, на котором я также тестировал эту неприятность, также не внесена соотв.поправка.
Сергей Борщ
Jan 25 2008, 15:18
Цитата(bvn123 @ Jan 25 2008, 16:58)

При 'большем кол-ве слэшей (если копировать из статьи по ссылке \\\\.\\COM10) не работало
Видимо, дельфи и С по-разному толкуют символ '\' в текстовых строках. В С он используется для задания спецсимволов, поэтому чтобы он попал в скомпилированный код его надо в исходнике написать дважды.
jorikdima
Jan 25 2008, 15:29
"nen тему надо в фак какой нибудь. Периодически всплывает. Я тоже знаю про эту особенность, но постоянно забываю медод исправления, а по-быстрому найти не получается.
Я не мудрствуя решал эту проблему проще, в диспетчере устройств присваивал номер СОМ-порта оставшийся от уже отключённого устройства, при присвоении ругается однократно, после - корректно работает.
bvn123
Jan 28 2008, 08:40
Цитата(ESL @ Jan 25 2008, 19:36)

Я не мудрствуя решал эту проблему проще, в диспетчере устройств присваивал номер СОМ-порта оставшийся от уже отключённого устройства, при присвоении ругается однократно, после - корректно работает.
не выход: проблема возникла у двух заказчиков, решил доработать ПО
paskal
Aug 30 2009, 15:31
Пишу обмен по СОМ порту через CreateFile. Правда порт виртуальный, на самом деле это драйвер FT232, но поначалу это проблем не составляло. Службы винды работают с ним точно также, как с настоящим. Передаю в качестве параметра "COM3", например и все ОК. Проблема появилась, когда стал пробовать программу на компе где мое устройство определяется как СОМ12. Вот тут CreateFile его категорически не видит. Как открывать порт с таким большим номером, подскажите.
AHTOXA
Aug 30 2009, 16:27
"\\\\.\\COM12"
Ну, или если паскаль, то '\\.\COM12'
paskal
Aug 30 2009, 19:23
Пишу обмен по СОМ порту через CreateFile. Правда порт виртуальный, на самом деле это драйвер FT232, но поначалу это проблем не составляло. Службы винды работают с ним точно также, как с настоящим. Передаю в качестве параметра "COM3", например и все ОК. Проблема появилась, когда стал пробовать программу на компе где мое устройство определяется как СОМ12. Вот тут CreateFile его категорически не видит. Как же открывать порт с таким большим номером?
Цитата(paskal @ Aug 30 2009, 22:23)

Пишу обмен по СОМ порту через CreateFile. Правда порт виртуальный, на самом деле это драйвер FT232, но поначалу это проблем не составляло. Службы винды работают с ним точно также, как с настоящим. Передаю в качестве параметра "COM3", например и все ОК. Проблема появилась, когда стал пробовать программу на компе где мое устройство определяется как СОМ12. Вот тут CreateFile его категорически не видит. Как же открывать порт с таким большим номером?
Открываете файл с именем "\\\\.\\COM12" (это запись на языке С, где обратные слеши в записи приходится удваивать). Если у вас другой язык програмирования, то истинное имя файла выглядит так
\\.\COM12
Это способ универсальный - годится и для COM1-COM9.
paskal
Aug 31 2009, 17:21
Помогите решить проблему.
Работаю с КОМом через стандартные службы винды CreateFile. Порт виртуальный, его делает драйвер FT-232, поэтому номер порта получится может какой угодно. На одном компъютере устройсво распозналось как COM7, работает ОК. Открывается, пишется, читается. Но на другом он распознался как COM12. И тут он не может даже открыться через CreateFile. Подозреваю, что дело в большом номере - 12. Потому что остальные порты на этом компе через туже функцию открываются. Посоветуйте как же открывать порт с таким большим номером?
Сдаётся мне, что когда тему подклеивают к предыдущей, то в исходном форуме ничего не остаётся... Вот и вопрошает бедняга уже третий раз...
Кстати, если я правильно запомнил, спрашивал он в форуме "Помощь начинающему", в подфоруме "Программирование". Имхо, этому топику там более подходящее место.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.