dllee
站務副站長
發表:321 回覆:2519 積分:1711 註冊:2002-04-15
發送簡訊給我
|
原問題:
■【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
|
ldd
一般會員
發表:12 回覆:62 積分:19 註冊:2004-07-06
發送簡訊給我
|
dllee大大
雖然這個方法可行 但是偵測的時間太久了 大概要花5秒左右去偵測
是否有比較快ㄉ方法可以偵測 ??不然每次開啟程式好像沒反應一樣
要等5秒才會完全開啟,請大大指教:)謝謝
|
dllee
站務副站長
發表:321 回覆:2519 積分:1711 註冊:2002-04-15
發送簡訊給我
|
需要 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
發送簡訊給我
|
我的com port共有五個 我之前也是跟你一樣ㄉ做法 但是因為太慢了
需等待五秒左右.....我ㄉ電腦是 p4 2.4G ram 512 ddr333 這樣等級
會太低ㄇ ㄎㄎ ... 可能是我電腦本身ㄉ問題巴 那我在別人電腦那邊
試試看..........:) 謝謝你ㄉ回覆
|
ldd
一般會員
發表:12 回覆:62 積分:19 註冊:2004-07-06
發送簡訊給我
|
試了三台電腦 結果感覺起來好像是我ㄉ電腦ㄉ問題.... 試了兩台電腦
賽揚...1G 一台 1個comport 0.6秒 另一台3個comport0.4秒.....挖咧
我這一台平均五秒多....怎麼差這麼多 不知道什麼因素影響這麼大.
我上傳我執行ㄉ畫面好了......
|
ldd
一般會員
發表:12 回覆:62 積分:19 註冊:2004-07-06
發送簡訊給我
|
哎呀 自問自答囉..... 找到原因了...... 原來是bluetooth 在作怪.........
bluetooth 在做快速開檔關檔會產生一些問題......怪不得其他兩台電腦
沒有bluetooth的電腦會這麼快 我這台慢ㄉ有點離譜.........
恩!~~~~~~~~~~ 不曉得還有沒有其他方法可以測試com port的狀態.......
|