線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:12001
推到 Plurk!
推到 Facebook!

系統 COM Port 列表對應的實體位置及是否占用

 
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-08 09:41:27 IP:61.224.xxx.xxx 未訂閱
原問題: ■【BCB】【問題】Comport被佔用  http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33600 ■【問題】如何取得pc上COM port數量 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=33009    參考資料: ■【Delphi】【轉貼】如何知道系統有幾個串口 http://delphi.ktop.com.tw/link.asp?topic_id=25373    此程式可以列出系統中所有的 COM Port 及其對應的實體位置,同時,可以檢查是否該埠正在使用中。 如果不想下載,可以直接看以下的 code :
//---------------------------------------------------------------------------
// COM Port Lister and Status Checker     version 1.0   
//
// 2003-07-08  (c) dllee.ktop.com.tw  by Lee,Dong-Liang
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//----------------------------------------------------------------------------//
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//----------------------------------------------------------------------------//
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
  StringGrid1->Cells[0][0]="COM Port";
  StringGrid1->Cells[1][0]="Physical Location";
  StringGrid1->Cells[2][0]="In Use";    // [HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM]
// "\\Device\\PTSerial0"="COM3"
// "\\Device\\Serial0"="COM1"      TStringList *tmp=new TStringList;
  TRegistry *reg=new TRegistry;
  reg->RootKey=HKEY_LOCAL_MACHINE;      if(reg->OpenKey("\\HARDWARE\\DEVICEMAP\\SERIALCOMM",false))
  {
    reg->GetValueNames(tmp);
    Label1->Caption="Total " String(tmp->Count) " COM Ports";
    for(int i=0;iCount;i  )
    {
      AnsiString asCOM=reg->ReadString(tmp->Strings[i]);
      int iCOM=asCOM.SubString(4,1).ToIntDef(0);
      if(iCOM>0 && iCOM<=255)
      {
        StringGrid1->Cells[0][iCOM]=asCOM;
        StringGrid1->Cells[1][iCOM]=tmp->Strings[i];
      }
    }
    reg->CloseKey();
  }
  delete reg;
  delete tmp;
}
//----------------------------------------------------------------------------//
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  for(int i=1;i<256;i  )
  {
    if(StringGrid1->Cells[0][i].Length()>3)
    {
      HANDLE hComm;
      hComm = CreateFile(StringGrid1->Cells[0][i].c_str(),
           GENERIC_READ | GENERIC_WRITE, 0, 0,
           OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
      if (hComm == INVALID_HANDLE_VALUE)
      {
        StringGrid1->Cells[2][i]="in used";
      }
      else
      {
        StringGrid1->Cells[2][i]="is free";
        CloseHandle(hComm);
      }
    }
  }
  ShowMessage("Check Completed!");
}
//----------------------------------------------------------------------------//
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  Close();
}
//----------------------------------------------------------------------------//
沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
附加檔案:33626_testCOMPort.zip
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-16 12:56:06 IP:211.72.xxx.xxx 未訂閱
dllee大大 雖然這個方法可行 但是偵測的時間太久了 大概要花5秒左右去偵測 是否有比較快ㄉ方法可以偵測 ??不然每次開啟程式好像沒反應一樣 要等5秒才會完全開啟,請大大指教:)謝謝
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-17 06:56:04 IP:211.76.xxx.xxx 未訂閱
需要 5 秒?! 可以請問是您的 COM Port 太多? 還是電腦等級太差? 在我的電腦按一下就出來啦,不需要花太多的時間。 對於每一個 COM Port 的判斷就只有:
      HANDLE hComm;
      hComm = CreateFile(COM_PORT_NAME, // 請自行輸入 COM_PORT_NAME
           GENERIC_READ | GENERIC_WRITE, 0, 0,
           OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
      if (hComm == INVALID_HANDLE_VALUE)
      {
        // COM_PORT_NAME "in used"
      }
      else
      {
        // COM_PORT_NAME "is free";
        CloseHandle(hComm);
      }
只是開檔/關檔,用不了太多的時間才是。 視動科技 VMASK - ViewMove Automation Software Kernel 發表人 - dllee 於 2004/08/17 06:59:30
------
http://www.ViewMove.com
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-17 09:19:12 IP:211.72.xxx.xxx 未訂閱
我的com port共有五個 我之前也是跟你一樣ㄉ做法 但是因為太慢了 需等待五秒左右.....我ㄉ電腦是 p4 2.4G ram 512 ddr333 這樣等級 會太低ㄇ ㄎㄎ ... 可能是我電腦本身ㄉ問題巴 那我在別人電腦那邊 試試看..........:) 謝謝你ㄉ回覆
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-17 09:45:47 IP:202.39.xxx.xxx 未訂閱
試了三台電腦 結果感覺起來好像是我ㄉ電腦ㄉ問題.... 試了兩台電腦 賽揚...1G 一台 1個comport 0.6秒 另一台3個comport0.4秒.....挖咧 我這一台平均五秒多....怎麼差這麼多 不知道什麼因素影響這麼大. 我上傳我執行ㄉ畫面好了......
ldd
一般會員


發表:12
回覆:62
積分:19
註冊:2004-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-17 10:18:29 IP:211.72.xxx.xxx 未訂閱
哎呀 自問自答囉..... 找到原因了...... 原來是bluetooth 在作怪......... bluetooth 在做快速開檔關檔會產生一些問題......怪不得其他兩台電腦 沒有bluetooth的電腦會這麼快 我這台慢ㄉ有點離譜......... 恩!~~~~~~~~~~ 不曉得還有沒有其他方法可以測試com port的狀態.......
系統時間:2024-03-29 13:48:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!