Virtual COM port 突然消失時的處理. |
答題得分者是:dotdot
|
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
大家好,
我正在寫的程式,是透過IrDA產生的virtual com port收送資料.
目前一切都很正常,也寫的差不多了.
但是我發現一個狀況,當這個COM Port被我的程式佔用後.
如果我去阻斷紅外線,PC這邊,這個Port就會消失.
此時就會發生exception.我的部分程式碼如下:
這code是我用來接收資料的thread.
(我用的是ComPort Library version 2.64 這是作者的網站http://www2.arnes.si/~sopecrni.不知道有沒有人跟我用一樣的)
===============================================================
void __fastcall Receiver::Execute()
{
Synchronize(Listener) ;
try{
while(!Terminated)
{
Listener() ;
}
}catch(...){
//#######################################
//Here is the problem
//
//#######################################
}
}// End of Execute()...
============================================== void __fastcall Receiver::Listener()
{
MainForm->ComPort1->Events.Clear() ;
MainForm->ComPort1->Events << evRxChar ;
while(true)
{
int receive_len ;
try{
MainForm->ComPort1->WaitForEvent(MainForm->ComPort1->Events,NULL,10) ;
}catch(...){
ShowMessage("COM Port Exception");
Terminate();
return ;
}
if(MainForm->ComPort1->InputCount()!=0)
{
receive_len = MainForm->ComPort1->ReadStr(small_buffer,16) ;
receiving_buffer = receiving_buffer + small_buffer ;
small_buffer="";
}
if(MainForm->ComPort1->Events.Contains(evRxChar)==false)
{break ;}
}//end of while-loop...
}//End of Listener()...
===============================================================
我在"void __fastcall Receiver::Execute()"中會抓到這個exception "ClearCommError function failed(win error code:31)"
然後我在上述兩行"#"的地方.試著去處理這個狀況,卻發現
我不管對這個ComPort元件做設定或關閉.都會得到另一個exception "PurgeComm function failed(win error code:31)"
接下來,我連我的程式就都關不掉了.因為要關閉的時候就會去close這個comport.
上述大致上就是我遇到的狀況,如果有描述不清的地方請告訴我.
想請問大家的是:
|
dotdot
版主 發表:29 回覆:142 積分:64 註冊:2002-08-09 發送簡訊給我 |
|
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
|
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
解決了~
我一直很困擾的是,抓到exception後,
ComPort一直不能再做任何控制(用這個Component提供的工具的話).
於是,我就想直接CloseHandle,再給一個新的.
我加入了以下的code到我的exception處理中.
=====================================================
ComPort1->Events.Clear() ;
HANDLE hCOM;
(int)hCOM = ComPort1->Handle ;
CloseHandle(hCOM);
hCOM = CreateFile("COM1",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);
ComPort1->Handle = (unsigned int)hCOM;
=======================================================
但是,這個ComPort1的handle,本來是敘述如下,
__property unsigned Handle = {read=FHandle, nodefault}; //在Cport.hpp中..
這樣寫,我沒辦法assign值給Handle,所以,我把它改成.
__property unsigned Handle = {read=FHandle, write=FHandle, nodefault};
一切就ok囉..
|
chilung
一般會員 發表:4 回覆:13 積分:3 註冊:2003-03-06 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |