Подкажите как в делфи найти 3G модем подключеный через USB, его название и на каком он порту??? Очень нужно Зарание спасибо З.Ы. Вариант "Диспетчер устройств" не предлагать
Перебором? Открывать каждый COM как файл и писать туда AT команду для вывода инфы. Можно каждый в своем потоке благо количество портов не велико. При подкючении через USB все равно создается COM (по другому не встречал)
Как-то так: Code: procedure TMainForm.BBGivePortClick(Sender: TObject); const BufSize = $FFFF; var Buf_DevList: Array[0..BufSize] of Char; DevName: PChar; begin Win32check(QueryDosDevice(nil, Buf_DevList, BufSize) <> 0); DevName := @Buf_DevList; while DevName^ <> #00 do begin if (StrLIComp('COM', DevName, 3) = 0) then MLog.Lines.Append(DevName); DevName := StrEnd(DevName)+1; end; end;
PHP: type TIntArray = array of Integer; Const ComDevName : AnsiString = 'COM'; function FindComPorts(Var Coms : TIntArray) : Boolean; const BufSize = $FFFF; var Buf_DevList : Array[0..BufSize] of AnsiChar; DevName : PAnsiChar; tmp : Integer; Begin Result := QueryDosDeviceA(nil, Buf_DevList, BufSize) <> 0; if not Result then Exit; SetLength(Coms, 0); DevName := @Buf_DevList; while DevName^ <> #00 do begin if (StrLIComp(PAnsiChar(ComDevName), DevName, Length(ComDevName)) = 0) then Begin tmp := StrToIntDef(Copy(DevName, Length(ComDevName)+1, Length(DevName) - Length(ComDevName)), -1); if tmp <> -1 then Begin SetLength(Coms, High(Coms)+2); Coms[High(Coms)] := tmp; end; end; DevName := StrEnd(DevName)+1; end; end; procedure FindModems(Const Coms : TIntArray; var Modems : TIntArray); Var {Разное} i : Integer; ret : Cardinal; Buf : AnsiString; {COM} CommDCB : TDCB; CommStat : TComStat; CommHandle : THandle; Begin SetLength(Modems, 0); for i := 0 to High(Coms) do Begin {Открываем COM порт} CommHandle := CreateFileA(PAnsiChar('\\.\' + ComDevName + IntToStr(Coms[i])), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if CommHandle = INVALID_HANDLE_VALUE then Continue; try {Начало работы с COM портом} if not (SetCommMask(CommHandle, EV_RXFLAG{ or EV_RXCHAR}) and GetCommState(CommHandle, CommDCB)) then Continue; with CommDCB do Begin BaudRate:= CBR_9600; Parity:= NOPARITY; ByteSize:= 8; StopBits:= OneStopBit; EvtChar:= chr($0D); end; if not SetCommState(CommHandle, CommDCB) then Continue; {Отправка AT комманды} Buf := 'ATV1'#13'ATQ0'#13'AT'#13; {В текстовый режим, включение ответа, пустая комманда} WriteFile(CommHandle, Buf[1], Length(Buf)*SizeOf(AnsiChar), ret, nil); Sleep(10); {Ждем 10 мС} ClearCommError(CommHandle, ret, @CommStat); {Только так, нужно проверить скок пришло данных для чтения} if CommStat.cbInQue <> 0 then Begin SetLength(Buf, CommStat.cbInQue); ReadFile(CommHandle, Buf[1], CommStat.cbInQue, ret, nil); if Trim(Buf) = 'OK' then Begin SetLength(Modems, High(Modems)+2); Modems[High(Modems)] := Coms[i]; end; end; finally CloseHandle(CommHandle); end; end; end; Прочтя две статьи(Команды AT и работа с COM протом), написал данный код...В чем была проблема тебе это сделать??? Есть одна тонкость - если модем используется другой прогой или подключен к интернету - не определится. Пользуйся гуглом, не плоди темы.
Jingo Bo, как пользаватся твоим кодом, как мне сделать чтобы по нажатию на батон эта процедура заработала, и вывести порт с модемом в едит????
{Сразу прошу прощения за оффтоп, но он уже РЕАЛЬНО ДОСТАЛ} Хочешь писать крутой софт (или хоть какой-нибудь) ЧИТАЙ КНИГИ, СТАТЬИ, ВКЛЮЧИ МОСК БЛЕАТЬ! И не плоди тупые темы.
Добрый день. Delphi XE2: Первая функция отрабатывает, однако вторая дает CommHandle = INVALID_HANDLE_VALUE во всех перебираемых com. Модем не юзается (3g-модем huawei) p.s. вот я ламер, разобрался с анси Delphi7: Вторая функция из 3 устройств com оставляет два, но модем только на одном из них, то есть отрабатывает опять неправильно(( p.s.> со вторым случаем разобрался. Там еще какой-то 3G PC UI Interface находится... с модемом одинаково хорошо работать с обоими этими портами (я отправляю смс)