реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как преодолеть ограничение номера COM-порта в XP?
bvn123
сообщение Jan 25 2008, 10:41
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 9-08-04
Пользователь №: 468



Здравствуйте,
при изготовлении устройств с использованием 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2008, 11:41
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



sprintf(comPortName, "\\\\.\\COM%d", comPortNumber);
или в вашем случае PChar('\\\\.\\COM'+inttostr(PortNumber)),


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
vvs157
сообщение Jan 25 2008, 11:50
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



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


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(vvs157 @ Jan 25 2008, 13:50) *
У Вас какой-то глюк в системе.
Глюка в системе нет. Просто имя порта для CreateFile надо указывать правильно. Вот: http://support.microsoft.com/kb/115831


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
bvn123
сообщение Jan 25 2008, 14:58
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 9-08-04
Пользователь №: 468



Цитата(Сергей Борщ @ 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, на котором я также тестировал эту неприятность, также не внесена соотв.поправка.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2008, 15:18
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(bvn123 @ Jan 25 2008, 16:58) *
При 'большем кол-ве слэшей (если копировать из статьи по ссылке \\\\.\\COM10) не работало
Видимо, дельфи и С по-разному толкуют символ '\' в текстовых строках. В С он используется для задания спецсимволов, поэтому чтобы он попал в скомпилированный код его надо в исходнике написать дважды.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jan 25 2008, 15:29
Сообщение #7


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



"nen тему надо в фак какой нибудь. Периодически всплывает. Я тоже знаю про эту особенность, но постоянно забываю медод исправления, а по-быстрому найти не получается.
Go to the top of the page
 
+Quote Post
ESL
сообщение Jan 25 2008, 15:36
Сообщение #8


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 19-07-06
Из: Москва
Пользователь №: 18 932



Я не мудрствуя решал эту проблему проще, в диспетчере устройств присваивал номер СОМ-порта оставшийся от уже отключённого устройства, при присвоении ругается однократно, после - корректно работает.
Go to the top of the page
 
+Quote Post
bvn123
сообщение Jan 28 2008, 08:40
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 112
Регистрация: 9-08-04
Пользователь №: 468



Цитата(ESL @ Jan 25 2008, 19:36) *
Я не мудрствуя решал эту проблему проще, в диспетчере устройств присваивал номер СОМ-порта оставшийся от уже отключённого устройства, при присвоении ругается однократно, после - корректно работает.

не выход: проблема возникла у двух заказчиков, решил доработать ПО
Go to the top of the page
 
+Quote Post
paskal
сообщение Aug 30 2009, 15:31
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Пишу обмен по СОМ порту через CreateFile. Правда порт виртуальный, на самом деле это драйвер FT232, но поначалу это проблем не составляло. Службы винды работают с ним точно также, как с настоящим. Передаю в качестве параметра "COM3", например и все ОК. Проблема появилась, когда стал пробовать программу на компе где мое устройство определяется как СОМ12. Вот тут CreateFile его категорически не видит. Как открывать порт с таким большим номером, подскажите.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 30 2009, 16:27
Сообщение #11


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



"\\\\.\\COM12"
Ну, или если паскаль, то '\\.\COM12' wink.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
paskal
сообщение Aug 30 2009, 19:23
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Пишу обмен по СОМ порту через CreateFile. Правда порт виртуальный, на самом деле это драйвер FT232, но поначалу это проблем не составляло. Службы винды работают с ним точно также, как с настоящим. Передаю в качестве параметра "COM3", например и все ОК. Проблема появилась, когда стал пробовать программу на компе где мое устройство определяется как СОМ12. Вот тут CreateFile его категорически не видит. Как же открывать порт с таким большим номером?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Aug 31 2009, 10:49
Сообщение #13


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(paskal @ Aug 30 2009, 22:23) *
Пишу обмен по СОМ порту через CreateFile. Правда порт виртуальный, на самом деле это драйвер FT232, но поначалу это проблем не составляло. Службы винды работают с ним точно также, как с настоящим. Передаю в качестве параметра "COM3", например и все ОК. Проблема появилась, когда стал пробовать программу на компе где мое устройство определяется как СОМ12. Вот тут CreateFile его категорически не видит. Как же открывать порт с таким большим номером?


Открываете файл с именем "\\\\.\\COM12" (это запись на языке С, где обратные слеши в записи приходится удваивать). Если у вас другой язык програмирования, то истинное имя файла выглядит так
\\.\COM12
Это способ универсальный - годится и для COM1-COM9.
Go to the top of the page
 
+Quote Post
paskal
сообщение Aug 31 2009, 17:21
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Помогите решить проблему.
Работаю с КОМом через стандартные службы винды CreateFile. Порт виртуальный, его делает драйвер FT-232, поэтому номер порта получится может какой угодно. На одном компъютере устройсво распозналось как COM7, работает ОК. Открывается, пишется, читается. Но на другом он распознался как COM12. И тут он не может даже открыться через CreateFile. Подозреваю, что дело в большом номере - 12. Потому что остальные порты на этом компе через туже функцию открываются. Посоветуйте как же открывать порт с таким большим номером?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 1 2009, 22:05
Сообщение #15


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Сдаётся мне, что когда тему подклеивают к предыдущей, то в исходном форуме ничего не остаётся... Вот и вопрошает бедняга уже третий раз...
Кстати, если я правильно запомнил, спрашивал он в форуме "Помощь начинающему", в подфоруме "Программирование". Имхо, этому топику там более подходящее место.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 11:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01552 секунд с 7
ELECTRONIX ©2004-2016