If you are using the LWRS_RECEIVE event to trigger your reads, you need to be careful to read ALL data that has arrived in your callback, especially if your trigger count for the event is relatively small.
Suppose that your callback is called, indicating that there are at least N bytes available to read. Now suppose that there are actually >= 2*N bytes waiting, or perhaps more bytes arrive between when your callback is called and when you call ComRead. If you always only read N bytes in your callback, you might leave N or more bytes still waiting in the queue. Because the number of bytes in the input queue never dropped below N since your callback was called, the event will not be re-enabled, and your callback will stop being called. You can avoid this by putting a loop in your callback that repeatedly gets the input queue length and reads until the input queue length is 0.
Of course, calling FlushInQ should also resolve the problem by dropping the input queue length to 0 (though it would do so by throwing away data), so I'm skeptical that this is the problem you're having. Some more details about how/when you read and what your callbacks look like might help us.
Mert A.