I've not done serial in years, and I've since written bufsock... You might try bufsock to see if it helps your situation: http://stromberg.dnsalias.org/~dstromberg/bufsock.html
It'll deal with things like waiting until a byte is ready, before giving up on a read. I've used on Cygwin, but never native Windows Python. But it's known to work on CPython 2.x, CPython 3.x, Jython and Pypy on *ix.
Don't let the name fool you - I wrote it for buffering sockets, but it works fine for file handles too.