Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

Список Com-портов   Найти похожие ветки 

 
Udaff ©   (2006-02-10 15:32) [0]

нужно получить список установленных на компьютере Com-портов. была идея попробовать открыть каждый с 1 по 8 поочереди и в зависимости от успешности попытки делать выводы, но отпадает ибо порт может быть занят другой прогой. у кого-нить есть еще идеи ?


 
Германн ©   (2006-02-10 16:00) [1]


> но отпадает ибо порт может быть занят другой прогой.


"занят другой прогой" вернет другой код ошибки нежели "отсутствует".


 
Leonid Troyanovsky ©   (2006-02-10 16:52) [2]


> Udaff ©   (10.02.06 15:32)

> нужно получить список установленных на компьютере Com-портов.


program devlist; {$apptype console}
uses windows, sysutils;
const BufSize = 1024;
var
 Buf_DevList: Array[0..BufSize] of Char;
 DevName: PChar;
begin
 if QueryDosDevice(nil, Buf_DevList, BufSize) = 0 then Exit;
 DevName := Buf_DevList;
 while DevName^ <> #00 do
 begin
   if (StrLIComp("COM", DevName, 3) = 0) then writeln(DevName);
   DevName := StrEnd(DevName)+1;
 end;
end.

--
 Андрей А. Лобанов <l...@nersa.ee>
 NERSA Limited

--
Regards, LVT.


 
tesseract ©   (2006-02-10 17:24) [3]

Так  проще


 ComList:=TstringList.Create;
 reg.OpenKey("hardware\devicemap\serialcomm",  false);
 ComList := TStringList.Create;
   reg.GetValueNames(ComList);
  for i:=0 to comList.Count-1 do
   ComList[i]:=(reg.ReadString(comList[i]));


 
Чапаев ©   (2006-02-10 20:03) [4]


> каждый с 1 по 8

Почему же по восьмой? В Windows COM-порт может иметь номер вплоть до 255. Как правильно говорит tesseract, надо из реестра читать.


 
tesseract ©   (2006-02-10 22:48) [5]

tesseract забыл добавить что при чтении с порта с номером больше 9 надо приписывать слева "\\.\" к имени порта. Типа "\\.\COM10".


 
GanibalLector ©   (2006-02-10 23:26) [6]


procedure TForm1.EnumPortClick(Sender: TObject);
var ByteNeeded,Returned,I:DWord;
Success:Boolean;
PortsPtr:Pointer;
InfoPtr:PPortInfo1;
TempStr:String;
begin
 Success:=EnumPorts(nil,1,nil,0,ByteNeeded,Returned);
 if (not Success) and (GetLastError=ERROR_INSUFFICIENT_BUFFER) then
 begin
   GetMem(PortsPtr,ByteNeeded);
   try
     EnumPorts(nil,1,PortsPtr,ByteNeeded,ByteNeeded,Returned);
     for i:=0 to Returned-1 do
     begin
       InfoPtr:=PPortInfo1(DWord(PortsPtr)+I*SizeOf(TPortInfo1));
       TempStr:=InfoPtr^.pName;
       if Copy(TempStr,1,3)="COM" then
         Memo1.Lines.Add(TempStr);
     end;
   finally
     FreeMem(PortsPtr);
   end;
 end;
end;

Взято у Паши Агурова ;)


 
Германн ©   (2006-02-11 03:58) [7]


> tesseract ©   (10.02.06 17:24) [3]
>
> Так  проще
>
>
>  ComList:=TstringList.Create;
>  reg.OpenKey("hardware\devicemap\serialcomm",  false);
>  ComList := TStringList.Create;
>    reg.GetValueNames(ComList);
>   for i:=0 to comList.Count-1 do
>    ComList[i]:=(reg.ReadString(comList[i]));
>
>


Проще <> верно.

Имхо, чтобы получить список действительных на сей момент "Com-портов" на компьютере, следует попытаться их последовательно открыть, проанализировать результат открытия и составить список исходя из попыток и ихи результатов.

Я, лично, следую пути ребят из TurboPower. Т.е. их реализации функции function IsPortAvailable(ComNum : Cardinal) : Boolean;


 
Anatoly Podgoretsky ©   (2006-02-11 10:23) [8]

Открывай и анализируй


 
tesseract ©   (2006-02-12 11:39) [9]


> Имхо, чтобы получить список действительных на сей момент
> "Com-портов" на компьютере, следует попытаться их последовательно
> открыть, проанализировать результат открытия и составить
> список исходя из попыток и ихи результатов.


Ты хочешь сказать что у тебя на наличие Com - портов "гуляет"? Тогда просто перечитай реестр.
В "HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP" содержится список всего оборудования. Он обновляется динамически.

Все "аппаратные" устройства будут и здесь :
"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\MultifunctionAdapter\6\SerialCon troller\ число от 0 до (кол-ва портов на машине -1)".
Здесь описаны параметры ISA-устройства.
В поле "Configuration DATA" можно прочитать ресурсы занимаемые портом.

Если порт занят то просто попробуй его открыть из полученного списка.  
А не перебирать все полученные значения - 255 портов ты слегка о-ь перебирать.


 
n0name   (2006-02-12 12:54) [10]


type
TSystemInformationClass=(
 SystemDeviceInformation = 7
);

_SYSTEM_CONFIGURATION_INFO = packed record
 DiskCount: DWORD;
 FloppyCount: DWORD;
 CDROMCount: DWORD;
 TapeCount: DWORD;
 SerialCount: DWORD;
 ParallelCount: DWORD;
end;

function NtQuerySystemInformation(SystemInformationClass: TSystemInformationClass; SystemInformation: Pointer;
SystemInformationLength: DWORD; ReturnLength: PDWORD): Integer; stdcall; external "ntdll.dll";

function GetSerialCount(): DWORD;
var
ns: Integer;
ConfInfo: _SYSTEM_CONFIGURATION_INFO;
begin
result := 0;
ns := NtQuerySystemInformation(SystemDeviceInformation, @ConfInfo, sizeof(ConfInfo), nil);
if ns <> 0 then exit;
result := ConfInfo.SerialCount;
end;



 
n0name   (2006-02-12 12:56) [11]

Чтоб получиться список COM-портов пробегаем от i = 0  до i = SerialCount - 1, Прот будет \\.\COM + i


 
tesseract ©   (2006-02-12 14:57) [12]

Угу только имей в виду что это будет работать только в NT/2k/XP. И номера com-портов могут подряд не идти.


 
kaZaNoVa ©   (2006-02-12 15:03) [13]

tesseract ©   (12.02.06 14:57) [12]
только в NT/2k/XP


а еще кто-то юзает/пишет под Вынь 9х ?))


 
tesseract ©   (2006-02-12 15:21) [14]


> а еще кто-то юзает/пишет под Вынь 9х ?))

Ну например я и куча людей которые к ним аппаратуру подключают на p1/p2 знаешь ли XP подтормаживает.


 
Anatoly Podgoretsky ©   (2006-02-12 15:23) [15]

kaZaNoVa ©   (12.02.06 15:03) [13]
Хоть количество и падает, но оно еще достаточное большое. Вот на Wim 3.1 уже мало пишут.


 
Игорь Шевченко ©   (2006-02-13 12:08) [16]

kaZaNoVa ©   (12.02.06 15:03) [13]

"Просто потрепаться вы можете в соотвествующей конференции"



Страницы: 1 вся ветка

Текущий архив: 2006.05.07;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
4-1139814010
Asail
2006-02-13 10:00
2006.05.07
Как получить caption окна чужой программы?


2-1145367987
jenya_rus
2006-04-18 17:46
2006.05.07
Считывание инфы с файла =)


2-1145374069
Lk
2006-04-18 19:27
2006.05.07
Работа с файлами


4-1139945594
Volf_555
2006-02-14 22:33
2006.05.07
Как свернуть/развернуть все MDI-окна в моём приложении?


15-1145053611
Gero
2006-04-15 02:26
2006.05.07
Закон