全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3158
推到 Plurk!
推到 Facebook!

Virtual COM port 突然消失時的處理.

答題得分者是:dotdot
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-19 16:18:55 IP:140.92.xxx.xxx 未訂閱
大家好, 我正在寫的程式,是透過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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-19 23:45:01 IP:61.70.xxx.xxx 未訂閱
你有試過 直接去執行compile後的.exe檔看看 而不是用bcb環境執行?
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-20 11:28:11 IP:140.92.xxx.xxx 未訂閱
謝謝dotdot的回覆. 嗯..我試過直接執行exe檔.但是一樣會出現那些exception的訊息. 不過.我的程式可以關掉. 只是會出現一些Unknown exception,access violation 及 "Abnormal Termination"
chilung
一般會員


發表:4
回覆:13
積分:3
註冊:2003-03-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-21 14:19:32 IP:140.92.xxx.xxx 未訂閱
解決了~ 我一直很困擾的是,抓到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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-21 14:30:38 IP:140.92.xxx.xxx 未訂閱
對了,是否有辦法把這個別人用pascal寫的comport元件, 在我的BCB中trace,debug呢?是要在安裝這元件時設定, 還是設定project的option呢? 我現在因為沒有裝Delphi,都是在Ultraedit下去看他的code. 目前是沒什麼問題,可是我想,也許會有需要改它的source code. 所以很好奇可不可以這樣做囉. Anyway,謝謝版主大人的快速回應,及各位的參與. Thank you~
系統時間:2024-04-27 0:31:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!