COM-порт

lexxyar
Дата: 05.12.2007 13:36:40
Доброго дня.

Есть вопросик: есть USB считыватель магнитных карт. Под него выделяется какой-то COM порт в системе. Есть ли способ узнать какой порт использует устройство?

Очень признателен за помощь.
Aleks_U
Дата: 05.12.2007 13:46:19
В большинстве существующих компов есть два COM порта. В этом случае имя виртуального порта скорее всего будет COM3. А в общем случае, нужно последовательно опрашивать порты COM1-COM4. У устройства наверняка есть какая-нибудь комманда запроса состояни.
lexxyar
Дата: 05.12.2007 13:49:28
Это понятно... вот только он определяется у меня 5-м...
А есть какой нить способ, что бы не перебором??
sqvidler
Дата: 05.12.2007 17:43:42
Думаю, надо копать сюда - Win32_PnPEntity Class, Win32_SerialPort Class.

Вот тут пример есть - WMI Tasks: Computer Hardware, How do I......identify devices that are not working (those marked with an exclamation point icon in Device Manager)?

Идея в чем. В компе один родной COM-порт и 4 порта, созданные мультипортовой платой MOXA CP114IS/PCI. Не USB, конечно, но, думаю, не суть.
Открываем свойства порта, тычем на закладку Detais - и смотрим properties.
Типа там Device Instance ID, Hardware IDs, Service и т.п...
Соотвественно, для родного порта и моксовых - там всё разное.
Anatoly Podgoretsky
Дата: 05.12.2007 18:26:20
lexxyar
Это понятно... вот только он определяется у меня 5-м...
А есть какой нить способ, что бы не перебором??

Зачем тебе узнаватьЮ если ты и так знаешь, что COM5
Bulygin Roman
Дата: 05.12.2007 21:46:34
Если без ухищрений, то можно перебрать все порты от COM1 до, например, COM32 (ну или COM256 ;) ) и попробовать открыть каждый. Какой откроется или выдаст AccessDenied в LastError, то этот существует (но возможно открыт кем-то ещё). Далее либо выводим пользователю TDropDownList со списком имеющих портов (пусть сам укажет, куда воткнул девайс), либо, если есть команда типа пинга или чтения статуса, то сразу посылаем её. Ответ есть? Это тот самый порт, на котором висит наш девайс!
eNose
Дата: 05.12.2007 23:18:57
не проще ли чем-нить типа MiTeC найти нужный девайс (USB считыватель магнитных карт в данном случае) и посмотреть в его свойствах COMPort?
lexxyar
Дата: 10.12.2007 11:51:33
Ребят, сделал проще... заглянул в реестр... там прописано все, сто мне нужно было =). А по поводу того, что знаю какой номер порта - так это только на моей машине, а те, кто потом будет эту прогу использовать - никто не знает, в какую дырку они воткнут девайс и какой порт она будет использовать.

вот так я его ищу.

function PortFind:integer;
var
  reg : TRegistry;
  ts : TStrings;
  i : integer;
  l_FP: integer;
begin
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.OpenKey('hardware\devicemap\serialcomm',
  false);
  ts  := TStringList.Create;
  reg.GetValueNames(ts);
  l_FP := 1;
  for i := 0 to ts.Count -1 do begin
    if ts.Strings[i] = '\Device\VCP0' then
      begin
        l_FP := StrToInt(StringReplace(reg.ReadString(ts.Strings[i]), 'COM', '',
                          [rfReplaceAll, rfIgnoreCase]));
        break;
      end;
  end;
  ts.Free;
  reg.CloseKey;
  reg.free;
  result := l_FP;
end;