由於USB-Com移除引起的異常非常討厭。所以我建議消除他們的大部分原因。
您必須處理Windows消息WM_DEVICECHANGE並檢測端口刪除。然後設置特殊標誌,並且不要對帶有此標誌的端口進行任何操作!如果再次插入USB-Com,則重新連接串行端口。一些代碼,以幫助:
const
DBT_DEVICEARRIVAL = $8000;
DBT_DEVICEREMOVECOMPLETE = $8004;
DBT_DEVICEQUERYREMOVE = $8001;
DBT_DEVTYP_PORT = 3;
type
PDevBroadcastHdr = ^TDevBroadcastHdr;
TDevBroadcastHdr = packed record
dbcd_size: DWORD;
dbcd_devicetype: DWORD;
dbcd_reserved: DWORD;
end;
PDEV_BROADCAST_PORT = ^TDEV_BROADCAST_PORT;
TDEV_BROADCAST_PORT = packed record
dbcp_size: DWord;
dbcp_devicetype: DWord;
dbcp_reserved: DWord;
dbcp_name: array[0..MAX_PATH] of Char;
end;
...
procedure WMDEVICECHANGE(var Msg: TMessage); message WM_DEVICECHANGE;
...
procedure TForm1.WMDEVICECHANGE(var Msg: TMessage);
var
prt: PDEV_BROADCAST_PORT;
s: string;
begin
if Msg.wparam = DBT_DEVICEREMOVECOMPLETE then
if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then
begin
b_PortRemoved := True; //check this flag before each operation with port.
prt := PDEV_BROADCAST_PORT(PDEV_BROADCAST_PORT(Msg.lParam));
s := prt.dbcp_name;
ShowMessage('ComPort ' + s + ' has been removed. What can I do?');
end;
if Msg.wparam = DBT_DEVICEARRIVAL then
if PDevBroadcastHdr(Msg.lParam)^.dbcd_devicetype = DBT_DEVTYP_PORT then begin
// USB-COM plugged, you can find it and make some reinitialisation
end;
end;
來源
2013-03-13 14:33:00
MBo
如果try-except塊未捕獲異常,那麼無論是異常沒有發生,你認爲它是,它被抓住了,其它的代碼比你早處理」試圖抓住它,或者它不是一個例外。既然你無法捕捉它,你怎麼知道這是一個EInOutError異常? – 2013-03-13 12:26:21
當USB串行被刪除時,您是否使用DBT_DEVICEREMOVECOMPLETE類型和DBT_DEVTYP_PORT設備類型捕獲消息WM_DEVICECHANGE? – MBo 2013-03-13 12:58:29
嗨,羅布,我彈出一個標題爲「應用程序錯誤」的對話框。對話框中的消息是001C7052模塊Project1.exe中的Exception EInOutError。這是在IDE /調試器之外運行應用程序。 – Nigel 2013-03-13 14:09:53