Поиск модема на порту в делфи.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Farcar, 3 Dec 2011.

  1. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Подкажите как в делфи найти 3G модем подключеный через USB, его название и на каком он порту???

    Очень нужно

    Зарание спасибо



    З.Ы. Вариант "Диспетчер устройств" не предлагать
     
  2. totenkopf

    totenkopf Elder - Старейшина

    Joined:
    19 Jul 2010
    Messages:
    92
    Likes Received:
    64
    Reputations:
    19
    Перебором? Открывать каждый COM как файл и писать туда AT команду для вывода инфы. Можно каждый в своем потоке благо количество портов не велико.
    При подкючении через USB все равно создается COM (по другому не встречал)
     
    #2 totenkopf, 3 Dec 2011
    Last edited: 3 Dec 2011
  3. Kandi

    Kandi Member

    Joined:
    18 Nov 2009
    Messages:
    344
    Likes Received:
    17
    Reputations:
    0

    Как-то так:
    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;
    
     
  4. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Kandi, у меня модем на 4 пору, Ваш код мне выводит 1,2,3,4,5
    Может есть еще какието решения?
     
  5. DYUMON

    DYUMON New Member

    Joined:
    15 Sep 2010
    Messages:
    68
    Likes Received:
    2
    Reputations:
    0
    пишешь в сокет "пыщ пыщ" если там есть модем то он отзовется
     
  6. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Если можно пример
     
  7. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    PHP:
    type
      TIntArray 
    = array of Integer;
    Const
      
    ComDevName AnsiString 'COM';

    function 
    FindComPorts(Var Coms TIntArray) : Boolean;
    const 
    BufSize $FFFF;
    var 
    Buf_DevList : Array[0..BufSizeof AnsiChar;
        
    DevName PAnsiChar;
        
    tmp Integer;
    Begin
        Result 
    := QueryDosDeviceA(nilBuf_DevListBufSize) <> 0;
        if 
    not Result then
          
    Exit;
        
    SetLength(Coms0);
        
    DevName := @Buf_DevList;
        while 
    DevName^ <> #00 do
        
    begin
            
    if (StrLIComp(PAnsiChar(ComDevName), DevNameLength(ComDevName)) = 0then
            Begin
                tmp 
    := StrToIntDef(Copy(DevNameLength(ComDevName)+1Length(DevName) - Length(ComDevName)), -1);
                if 
    tmp <> -1 then
                Begin
                    SetLength
    (ComsHigh(Coms)+2);
                    
    Coms[High(Coms)] := tmp;
                
    end;
            
    end;
            
    DevName := StrEnd(DevName)+1;
        
    end;
    end;

    procedure FindModems(Const Coms TIntArray; var Modems TIntArray);
    Var {
    Разное}
        
    Integer;
        
    ret Cardinal;
        
    Buf AnsiString;
        {
    COM}
        
    CommDCB TDCB;
        
    CommStat TComStat;
        
    CommHandle THandle;
    Begin
        SetLength
    (Modems0);
        for 
    := 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 протом), написал данный код...В чем была проблема тебе это сделать???

    Есть одна тонкость - если модем используется другой прогой или подключен к интернету - не определится. Пользуйся гуглом, не плоди темы.
     
  8. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Jingo Bo, как пользаватся твоим кодом, как мне сделать чтобы по нажатию на батон эта процедура заработала, и вывести порт с модемом в едит????
     
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    {Сразу прошу прощения за оффтоп, но он уже РЕАЛЬНО ДОСТАЛ}
    Хочешь писать крутой софт (или хоть какой-нибудь) ЧИТАЙ КНИГИ, СТАТЬИ, ВКЛЮЧИ МОСК БЛЕАТЬ!
    [​IMG]
    И не плоди тупые темы.
     
    #9 xophet, 9 Dec 2011
    Last edited: 9 Dec 2011
  10. Yugen

    Yugen New Member

    Joined:
    25 Feb 2011
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Добрый день.
    Delphi XE2: Первая функция отрабатывает, однако вторая дает CommHandle = INVALID_HANDLE_VALUE во всех перебираемых com. Модем не юзается (3g-модем huawei) p.s. вот я ламер, разобрался с анси
    Delphi7: Вторая функция из 3 устройств com оставляет два, но модем только на одном из них, то есть отрабатывает опять неправильно((
    p.s.> со вторым случаем разобрался. Там еще какой-то 3G PC UI Interface находится... с модемом одинаково хорошо работать с обоими этими портами (я отправляю смс)
     
    #10 Yugen, 18 Sep 2012
    Last edited: 18 Sep 2012