![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
И снова про 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;
Может кому-то это пригодиться.