Serial communications (serin/serout - not hserin/hserout) with PBP and a 20 MHz PIC easily goes past 38,400 bps. I use 38,400 bps in several projects for PIC to PIC datagrams.
What I recommend however is that you pace the characters at the transmitter end to allow the receiving device to process the data before the next character arrives.
Serin is a software routine. While that instruction is running, nothing else can happen. SERIN focusses 100% on the character coming in and half way into the stop bit it exits the SERIN routine and processes the character. In general you have only half a stop bit time to process the character before the next one arrives. At 38,400 bps each bit time is approximately 26 uSecs. That means you have only 13 uSecs to process the just received character before the start of the next character. That means you can only execute approximately 60 machine code instructions, or maybe 6 BASIC instructions, before the next character arrives - this is very tight.
By putting a CHAR_PACING 100 (or your choice of delay) statement at the start of your program you will effectively extend the transmitter's stop bit time and give the receiving device more time to process the character before the next character arrives.
HTH
Brian
Bookmarks