I have looked into the wine code now, and async reads from the COM port are just broken.
The app calls read, wine sets off the FILE_AsyncReadService, and then returns to the app.
FILE_AsyncReadService is called each time a character is received from the COM port, and it buffers up the received characters in the 1024 bytes buffer.
The next time the app calls read, wine sets off a new (now making it two) FILE_AsyncReadService, but clears the buffer first, so all the characters received from the previous FILE_AsyncReadService get lost.
This is where the input characters are getting lost.
James