Yes, if an unexpected error happens while processing serial communication it should close the port.
Like I said in first post, there's no serial communication at this point. Both at the point when the unhandled exception was raised, and the point before I call `VaComm1.Close()`, `VaComm1.ReadBufUsed()` returns 0.
I don't know how events work in Delphi, but maybe do you think when `VaComm.OnRxChar()` returns this is registered somewhere: that it finished and returned successfully? So if an exception happens inside `OnRxChar()` it never `return`s that it finished? So `FEventThread.WaitFor()` is waiting for `OnRxChar()` to finish and return?