Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Вниз

Список 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.012 c
15-1144403066
Таня
2006-04-07 13:44
2006.05.07
Трудная задача по Информатике


15-1145028356
Kart S.
2006-04-14 19:25
2006.05.07
TEditWindow (Кто помнит Turbo Vision?)


3-1142352897
Taurus
2006-03-14 19:14
2006.05.07
Выбор варианта вычислений


15-1145007228
Tirael
2006-04-14 13:33
2006.05.07
softice


11-1125510817
glesik
2005-08-31 21:53
2006.05.07
Проблема: дублирование кода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский