Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

И снова про USB-COM и проблемы с ним... [D7, WinXP]


GL00m ©   (2006-07-18 00:34:00) 

Вкратце: есть сотовый модем, цепляется на COM-порт, в системе не хватает портов, поэтому взял обычный переходник USB->COM. Читал в форуме, что проблем много и что не все режимы поддерживаются, но... Долбаный hyperterminal виндовый работает, а когда я пытаюсь сделать
ComPortHandle := CreateFile(PAnsiChar(ComPortName),
                               GENERIC_READ or GENERIC_WRITE,
                               0,
                               nil,
                               OPEN_EXISTING,
                               FILE_ATTRIBUTE_NORMAL,
                               0);

где ComPortName = 'COM15', то я получаю инвалидный хэндл с ГетЛастЕррором: The system cannot find the file specified.
Я бы может и промолчал бы, но Гипертерминал-то пашет и все с ним работает. Может подскажете, где я лох (не считая того, что пользуюсь этим переходником =))?


GL00m   (2006-07-26 00:40:00) [1]

Спасибо, вроде дошло.


Anatoly Podgoretsky   (2006-07-23 13:41:00) [2]

GL00m   (19.07.06 23:02) [5]
Тогда я извиняюсь, мне, наверно, уже тогда в "начинающие"... Я просто не совсем понимаю, зачем "\\.\", ведь без этого не работает, а если номер меньше 10, то работает. Т.е. я просто пишу CreateFile(PAnsiChar('COM1'), GENERIC_READ итд итп и все работает, а если то же самое, но 'COM15', то фигу. Расскажите, если не сложно? =(

Это означает доступ к физическому устройству, устройства 1-9 предопределенные с времен ДОС и поэтому указание \\.\ не является обязательным. Это относится не только к СОМ портам.


Rouse_   (2006-07-20 12:21:00) [3]

Этот набор символов является именем устройства на локальной машине... (ибо точка)


GL00m   (2006-07-19 23:57:00) [4]

to artem1987
А насколько это необходимо, прописывать SECURITY_ATTRIBUTES в данном случае?
FILE_SHARE_READ и WRITE мне не нужны из-за целей программы.


GL00m   (2006-07-19 23:51:00) [5]

Да... Раза с десятого я допер, что написано именно
for all port numbers
Короче, пихать эти непонятные слэши с точкой ко всем названием и будет мне счастье. Но все-таки интересно, что значит этот набор символов??? =)


GL00m   (2006-07-19 23:02:00) [6]

Тогда я извиняюсь, мне, наверно, уже тогда в "начинающие"... Я просто не совсем понимаю, зачем "\\.\", ведь без этого не работает, а если номер меньше 10, то работает. Т.е. я просто пишу CreateFile(PAnsiChar('COM1'), GENERIC_READитд итп и все работает, а если то же самое, но 'COM15', то фигу. Расскажите, если не сложно? =(


StriderMan   (2006-07-18 18:55:00) [7]

прочитайте внимательно

use the following syntax: "\\\\.\\COM10". This syntax works
for all port numbers and hardware that allows COM port numbers
to be specified.

...и скажите зачем делать такие проверки

> if Length(ComPortName) > 4 then ComPortName := '\\.\' +
> ComPortName;


artem1987   (2006-07-18 17:29:00) [8]

var
SA : SECURITY_ATTRIBUTES;
s : string;
h : THandle;
begin
// формирование SA
SA.nLength:= SizeOf(SECURITY_ATTRIBUTES);
SA.lpSecurityDescriptor:= nil;
SA.bInheritHandle:= False;
...
s:=Format('\\.\%s:',[s[i]]);
h:= CreateFile(PChar(@s[1]),GENERIC_READ or GENERIC_WRITE,
                       FILE_SHARE_READ or FILE_SHARE_WRITE, @SA, OPEN_EXISTING, 0, 0);
...
end;


GL00m   (2006-07-18 01:27:00) [9]

Пардон, ошибка - не "пригодиться", а "пригодится".


GL00m   (2006-07-18 01:26:00) [10]

Вот, извиняюсь, <плохое слово>!.. Проблему решил почитав MSDN из интернета, а не с диска. Цитата:
To specify a COM port number greater than 9, use the following syntax: "\\\\.\\COM10". This syntax works for all port numbers and hardware that allows COM port numbers to be specified.
Такого я раньше не видел, решение проблемы, соответственно, оказалось простым:
if Length(ComPortName) > 4 then ComPortName := '\\.\' + ComPortName;
Может кому-то это пригодиться.


Наверх

Титульная страница Поиск, карта сайта Написать письмо