А я по сообщению WM_DEVICECHANGE с параметром DBT_DEVNODES_CHANGED посылаю CDC-девайсу команду ClearCommBreak(). Если отвечает false, то закрываю порт, считая девайс выдернутым из гнезда. На этой команде открытый порт не виснет. А если там не FT232, а встроенный в МК USB-контроллер, то предварительно беспоюсь, чтобы запрос SEND_BREAK не игнорировал.